BASH [options] [file]
-e 每条指令执行后,都用#? 去判断他的返回值,0就是正确执行,非零就是执行有误,使用后可以不用自己写代码去判断返回值,非零,脚本就会退出。
-n 功能测试语法是否有误,不会实际执行命令
-c 若用-c参数,则bash从字符串中读入命令,如果字符串后还有变量就被设定为从$0开始的位置参数
-x 把脚本执行的结果显示出来
前面有“+”号的行是shell脚本实际执行的命令
前面有“++”号的行是执行trap机制中指定的命令 (trap 中断机制 用来定义指定信号如何处理脚本就是kill那些信号)
其它的行则是输出信息。
-v 执行脚本之前,把脚本内容打印出来
-i 若用-i参数,则bash是交互的。
-s 若用-s参数,则bash从标准输入中读入命令(在执行完-c带的命令之后。)直到输入exit
- 单一的号表明参数执行完毕,并且屏蔽此后所跟参数,后面的所有变量都被看作是文件名
-norc 如果bash是交互的,则不执行个人初始化文件:-/.bashrc,如果bash作为sh来运行,这个参数缺省是关闭的
${} 界定变量边界,并引用变量取值
${#} 能取变量长度
$(COMMAND) shell扫描命令行,扫描到这个结构就会把括号内命令执行一次,标准输出到调用的命令上,命令中错误输出不会被替换,只替换标准输出
()与{} 圈定范围,可以执行一组命令用分号隔开
()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行 当前termial
()最后一个命令可以不用分号,{}最后一个命令必须要用分号
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令
${var:?string} 替换规则:若变量var不为空,则用变量var的值来替换${var:?string}
若变量var为空,则把string输出到标准错误中,并从脚本中退出。
可利用此特性来检查是否设置了变量的值
$((exp)) POSIX标准的扩展计算这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$((exp)),包括三目运算符
注意:这种扩展计算是整数型的计算,不支持浮点型和字符串等若是逻辑判断,表达式exp为真则为1,假则为0
${}
infra-etcd-cluster-1
HOSTNAME=$(hostname)
命令 解释 结果
${HOSTNAME#*-} 拿掉第一个 - 及其左边的字符串 etcd-cluster-1
SET_ID=${HOSTNAME#*-}
# echo $SET_ID
etcd-cluster-1
命令 解释 结果
${HOSTNAME##*-} 拿掉最后一个 - 及其左边的字符串 1
SET_ID=${HOSTNAME##*-}
# echo $SET_ID
1
命令 解释 结果
${HOSTNAME%-*} 拿掉最后一个 - 及其右边的字符串 infra-etcd-cluster
SET_ID=${HOSTNAME#*-}
# echo $SET_ID
infra-etcd-cluster
命令 解释 结果
${HOSTNAME%%-*} 拿掉第一个 - 及其右边的字符串 infra
SET_ID=${HOSTNAME#*-}
# echo $SET_ID
infra
看到过一种记忆方法很有趣
以$为分界限,在左侧的#就是左删除,在右侧的%就是右删除
单一符号最小匹配就是第一,两个符号就是最大匹配就是最后一个
*用来匹配要删除的部分
类似与-的那个位置作为分隔符,在星号左侧为删除-左侧的字符串,在星右侧为删除右侧的字符串
${file:0:5} 提取最左边的 5 个字节 ${file:5:5} 提取第 5 个字节右边的连续 5 个字节 ${file/xxx/path} 将第一个 xxx 替换为 path ${file//xxx/path} 将全部 xxx 替换为 path ${#file} 获取变量长度