shisgmei 发表于 2018-8-23 13:24:17

shell编程知识点总结(一)

  灵活的运用shell编程的技巧及相关知识会让我们的shell编程有很大的提高,所以基础知识还是很有必要去认真的学习的
  脚本基本用法理解
  


[*]脚本必须以#!开头 #!/bin/bash
[*]# 注释行,不执行 除此外都是脚本的有效执行部分
[*]执行一个脚本 ./first.sh   bash first.sh 或把当前路径添加到PATH中
[*]反引号是命令的执行结果
[*]then的前面要加分号,不加分号then放到下一行
[*]bash 测试(-n –x)
[*]测试脚本是否有语法错误 bash -n 脚本(模糊测试)
[*]bash -x 脚本 (执行脚本):单步执行
[*]exit:退出脚本
[*]exit 后跟数值(0-255) 0是正确数值执行状态结果
[*]如果脚本没有明确定义退出状态码,那么最后执行的一条命令的退出码就是脚本的退出码
  

  变量
  


[*]变量是内存空间,是命名的内存空间 内存:是编址的存储单元 进程:临时存储数据需要变量
[*]变量名称
[*]只能包含字母、数字和下划线,并且不能以数字开头;
[*]不应该跟系统中已有的环境变量重名
[*]最好见名思意
[*]变量类型:事先确定数据的存储格式和长度
[*]数值
[*]整型 :8bit :0-255
[*]浮点型:11.13a带小数点,带精度的
[*]Shell变量问题(各种变量介绍—环境,本地,特殊等)
[*]与:只要一个为假结果一定为假
[*]shell弱类型编程语言
[*]强:变量在使用前,必须事先声明,甚至还需要初始;
[*]弱:变量用时声明,甚至不区分类型
[*]
[*]变量赋值:VAR_NAME=VALUE
[*]bash变量类型对变量的作用范围以及变量本身的表示形式分类
[*]环境变量:(当前shell进程以及子shell进程)
[*]本地变量(局部变量):当前shell进程
[*]位置变量:$1,$2,....是位置变量
[*]shift:轮替,可以隔开显示 shift可以剔除前n个参数
[*]特殊变量:$? $#:参数的个数
[*]$*:参数列表 “$*”
[*]$@:参数列表“$@”
[*]本地变量
[*]引用变量:${},括号可以省略
[*]如果变量后加有字符时需花括号
[*]内部有变量需替换时用双引号否则用单引号
[*]局部变量
[*]localVARNAME=VALUE:作用域为当前代码段
[*]环境变量:
[*]作用域为当前shell进程及其子进程。
[*]export VARNAME=VALUE
[*]导出变量:export VARNAME=VALUE 定义的时候直接导出
[*]VARNAME=VALUE先定义再用 export VARNAME 导出
[*]脚本在执行时会启动一个子shell进程:
[*]命令行中启动的脚本会继承当前shell环境变量
[*]系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量
[*]程序执行后可能有两类返回值
[*]$? :保存上一个命令的执行状态返回值
[*]1 程序执行结果
[*]2 程序状态返回代码(0-255)
[*]0: 正确执行
[*]1-255:错误执行1,2,127(只是系统预留的有特殊意义,其他的用户可自己定义)
[*]
[*]查看当前shell的变量
[*]Set
[*](不带任何参数与选项的set命令)
[*]查看当前shell的环境变量:
[*]printenv
[*]env
[*]export
[*]脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
[*]Export
[*]exportPATH=$PATH:/usr/local/apache/bin在其后添加路径
[*]export PATH=/usr/local/mysql/bin:$PATH
[*]撤消变量;
[*]unset VARNAME撤消变量 不加$符
  

  条件测试的表达式
  


[*]字符测试
[*]==两个等于号或者一个= 前后要有空格两端有空格,否则是赋值;相等为真,不等为假
[*]!= :测试是否不等于,不等为真,否则为假
[*]>:大于 一个字符串是否大于另一个字符串
[*]” /etc/passwd; then:这其中的if直接取得的是命令的执行状态值 if可自己识别 if [ ! -e $file ], then echo "No $file." exit 8
[*]双分支的判断语句
[*]if判断条件: then
[*]statement1
[*]statement2
[*]else
[*]statement3
[*]statement4
[*]......
[*]fi
[*]多分支的if语句
[*]if 判断条件1;then
[*]statement1
[*]....
[*]elif 判断条件2; then
[*]statement2
[*].....
[*]elif 判断条件3; then
[*]statement3
[*].......
[*]else
[*]statement4
[*]......
[*]fi
[*]case语句
[*]选择结构
[*]case SWITCH in
[*]valuel)
[*]statement
[*]....
[*];;
[*]value2)
[*]statement
[*]....
[*];;
[*]esac
[*]循环
[*]循环:进入条件,退出条件
[*]for 变量 in 列表; do
[*]循环体
[*]done
[*]例如:
[*]for I in 1 2 3 4 5 6 7; do
[*]加法运算
[*]done
[*]遍历完成之后,退出;
  

  引用变量或变量中的字符长度
  


[*]如:A=start ------判断A有多少个字符
[*]echo ${#A} :引用变量名的长度(#号表示变量中所包含字符串的长度)
[*]${#VARNAME}:就可以取字符串的长度
[*]例如:
[*]stty -F /dev/console size:可以查看物理终端一屏有多少行多少列
[*]stty -F /dev/console size | awk '{print $2}' :可以取出一屏有多少列
[*]也可以写成:A=`stty -F /dev/console size`——>echo ${A#*}
[*]还可以写成:stty -F /dev/console size | cut –d’ ‘-f2
[*]echo ${A#*}:表示从左往右找,找到第一个以空格为分隔符的把左侧的去了
[*]echo ${A##*}:从左往右找,找到最后一个空格,把前面的去了
[*]这两种分隔符的不同之处就是第一个空格为分隔符和最后一空格为个分隔符
[*]还有与之相反的一个
  

  变量赋值
  


[*]${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;
[*]${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;
[*]${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;
[*]${parameter:offset}
[*]${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;
[*]A=3 echo ${A:-39} 结果是:3
[*]uset A echo ${A:-30 结果是:3
  

  经常使用的小方面
  


[*]数据黑洞
[*]/dev/null:软件设备,软件模拟设备 bit bucket(数据黑洞)
[*]id student $> /dev/null
[*]read 后跟变量 read -p选项 ”PEOMPT“:变量1 变量2 -p后跟是echo输出相同 -t 设置超时
  

  知识点还不够全面,当学习到新的知识点时,会继续追加的


页: [1]
查看完整版本: shell编程知识点总结(一)