shell基本语法 常用指令 cat
打印到标准输出设备上
grep
查找文件里符合条件的字符串或正则表达式
awk
awk 是一个文本处理工具
curl
请求web服务工具
sed
文本处理工具wc
行统计工具
shell中可以 使用linux下各种工具不一一举例
运算语句 赋值 赋值和其他语言一样,使用“=”
1 2 3 4 5 6 7 8 9 10 # 数字 a=1 # 字符串 name='aaa' 或 name=“aaa” #路径 PACK_TOOL_DIR=/linux/Linux_Pack_Firmware
运算符号 运算符号不能单独使用,需要配合运算命令
1 2 3 4 + 加 -减 *乘 /除 % → 取余 ** → 开方
数学计算 shell 数学计算的几种命令,搭配上文运算符使用整数运算
1 2 3 4 5 6 7 8 9 # expr expr 1 + 1 # let let a=100/3;echo $a # $(()) echo $(( 100*3 ))
浮点数运算
1 2 3 4 5 # bc scale 为保留几位小数,可以不设置,默认是0 echo "scale=2;100/3"|bc => 33.33
逻辑运算 1 2 3 逻辑与运算 && 逻辑或运算 || 逻辑非运算 !
条件语句 常使用在if语句中
条件比较 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 数字比较 -eq 等于 equal -gt 大于 -lt 小于 -ge 大于或等于 -le 小于或等于 -ne 不等于 # 字符串比较 == 等于 != 不等于 -n 检查字符串的长度是否大于0 -z 检查字符串的长度是否为0 =~ 包含字符串
使用案例: strA 是否包含strB字符串
1 2 3 4 5 6 7 8 if [[ $strA =~ $strB ]] then echo "包含" else echo "不包含" fi
KEY_A 大于0 小于50 满足条件
1 2 3 4 5 6 7 8 9 10 if [ $KEY_A -gt 0 ] && [ $KEY_A -lt 50 ];then echo "检测到按键 变化 $KEY_A" if [ $key_value -eq 0 ];then echo "输出电平1 改变 $KEY_A" else echo "输出电平0 改变 $KEY_A" fi else flag=2 fi
注意:“[]” 内部两边需要有“ ”空格,其他条件需要另外的”[]”并用逻辑符号
文件判断 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。 [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。 [ -d DIR ] 如果 FILE 存在且是一个目录则为真。 [ -e FILE ] 如果 FILE 存在则为真。 [ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。 [ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。 [ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。 [ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。 [ -r FILE ] 如果 FILE 存在且是可读的则为真。 [ -s FILE ] 如果 FILE 存在且大小不为0则为真。 [ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。 [ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。 [ -w FILE ] 如果 FILE存在且是可写的则为真。 [ -x FILE ] 如果 FILE 存在且是可执行的则为真。 [ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。 [ -G FILE ] 如果 FILE 存在且属有效用户组则为真。 [ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。 [ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。 [ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
循环语句 for 循环 1 2 3 4 5 6 7 8 9 10 11 12 # 普通定值循环 for ((i=1; i<=j; i++)) do .... done # 遍历列表 for i in {1..9} do .... done
while 循环 条件成立,执行
1 2 3 4 while [ 条件或者函数返回值 ] do .... done
until 循环 条件不成立,则执行
1 2 3 4 until [ 条件 ] do .... done
参数传递 shell脚本在执行时可传递参数,以下是脚本内对参数的处理符号
1 2 3 4 5 6 7 $# 传递脚本参数个数 $* 所有参数组成一个字符串, *也可指第几个参数,$0 $$ 当前进程号 $! 后台运行的最后一个进程的ID号 $- 显示Shell使用的当前选项,与set命令功能相同 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
使用参考:
1 2 3 4 5 6 7 8 9 10 11 获取所有的参数放入OPTIONS,没有默认带-allsave OPTIONS="${@:-allsave}" 结合 For 循环,遍历参数选项 for option in ${OPTIONS}; do case $option in xxx) fun_xxx ;; 执行函数xxx xxx) fun_xxx ;; *) usage ;; 其他参数 esac done
函数 shell含有内置函数和自定义函数自定义函数
1 2 3 4 5 6 7 # 标准写法 function show(){ .... } # 函数调用 show
函数也可以传参
内置函数 内置函数 也是shell内置命令,可以使用 help查看
获取当前符合条件的参数列表
getopts OPTSTRING VARNAME
OPTSTRING:字符串,包含所有选项和“:”(“:”表示选项后面需要加参数)
VARNAME:变量,用来保存getopts获取到的选项
OPTARG: 参数会放入OPTARG中
OPTIND: 参数操作数,类似数组下标
使用参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 while getopts ":a:bc" opt do case $opt in a) echo "this is -a option. OPTARG=[$OPTARG] OPTIND=[$OPTIND]" ;; b) echo "this is -b option. OPTARG=[$OPTARG] OPTIND=[$OPTIND]" ;; c) echo "this is -c option. OPTARG=[$OPTARG] OPTIND=[$OPTIND]" ;; ?) echo "there is unrecognized parameter." exit 1 ;; esac done