shell以 #!/bin/sh开头,除此外#表示一行注释的开始。
变量:
变量无需事先声明。
$var表示引用变量var的值,如无定义则无值
$(var)同上,用于同$varx等区分
$(var:-thing),var存在且非null,取var的值,不然取thing的值,var的值不受影响
$(var:+thing),var存在且非null,取thing的值,不然无值
$(var:=thing),var存在且非null,取var的值,var的值不变,不然取thing的值,var的值改成thing
$(var:?message),var存在且非null,取var的值,不然打印message并退出,如果message未定义则打印parameter null or not set
上面的冒号可选,没有冒号时只要存在即可,不判断是否null
一些特殊变量
$# 目前进程参数个数
$@ 传递给当前进程命令行参数,置于双引号中时可被展开
$* 当前进程命令行参数,置于双引号时展开一个。
$- 连字符,给予shell选择项
$? 前一退出状态,如对timeout的判断
$$ 进程标示符
$0 进程名称
$! 最后一个后台命令的进程编号
$HOME 根目录
$PATH 命令查找路径
$PWD 当前工作目录
${#var} 返回字符串var的长度
模式匹配运算符:
${var#pattern} 删除匹配的最短部分,如var=/home/user/downloads/src/file.c, 那么${var#/*/}即为user/downloads/src/file.c,通配符表示不管两个//中间内容。
${var##pattern} 删除匹配的最长部分,如var=/home/user/downloads/src/file.c, 那么${var##/*/}即为file.c,通配符表示不管两个//中间内容。
${var%pattern} 删除右边开始匹配的最短部分,如var=/home/user/downloads/src/file.c, 那么${var%/*}即为/home/user/downloads/src。
${var%%pattern}删除右边开始匹配的最长部分,如var=/home/user/downloads/src/file.c, 那么${var%%/*}即为空。
条件判断:if then elif then else fi
快捷符号 &&和 ||, 如if [] && do_sth then... 和if [] || do_sth。
因为shell从左往右执行,所以对于&&,如果if不为真,那么就没必要再去判断do_sth了,即do_sth不执行,
对于||,如果if为真,那么就没必要去判断do_sth,即do_sth不执行。
test表达式即if [ test ]:
运算符 真
string string不为NULL
-b file file是块设备文件
-c file file是字符描述文件
-d file file是文件夹
-e file file存在
-f file file为一般文件
-g file file有设置它的setgid定位
-h (或者-L)file file是符号链接
-n string string非NULL
-p file file是管道pipe
-r file file可读
-s file file不是空的
-S file file是socket
-t n 文件描述符n指向终端
-u file file有设置它的setuid定位
-w file file可写
-x file file可执行或是可搜索的目录
-z string string为NULL
s1 = s2 相等
s1 != s2 不等
n1 -eq n2 整数相等
n1 -ne n2 整数不等
n1 -lt n2 n1<n2
n1 -gt n2 n1>n2
n1 -le n2 n1<=n2
n1 -ge n2 n1>=n2
在test前加!表示否定结果,-a表示而且,-o表示或者,-a的优先级高于-o,如
if [ -n “$string” -a -f “$file”] 在结果上等同于 if [ -n “$string” ] && [ -f “$file” ] ,引号最好加上,不然字符串为空时可能导致奇怪问题,比如[-n -a -f $file]
另为防止字符串以-开头时产生的问题,通常加上x,如
如if [ "x$1" = "xnand" ] 表示判断输入的第一个参数是否是"nand"
getopt: getopt后的参数如果紧跟冒号,表示这个参数是必须的,如update ht:d:f:m:c,这里tdfm都是必须的。
暂时用到那么多,有需要再来编辑。