Bash 脚本语法
每次学了忘,忘了学,怎么记不住,因为长时间不用了
Bash 流程控制
循环
for循环
for item in $list do echo $item done
另一种与C语言类似的写法
for((i=0; i<10; i++)) do echo $i done
双括号是个非常好的东西!
还有一种
for i in $(seq 1 5)do done
seq还有第三个参数表示step
更叼的
for i in {1..10} do done
还可以指定{1..10..step}
条件分支
if [ -f $file_path ]; then #do_something fi
if 后面跟条件如为0则进入then分支,这个和C/C++不同,因为bash主要用来根据一些命令的成功与否进行进一步的操作,命令执行成功则返回0,失败则非零
一般在if后面总是跟个中括号,但它不是bash语法的一部分,[ 也是一个命令,是bash的内建命令,它的参数以]结尾,与命令test功能一致
条件取反
加!即可
类似C中的Switch语句
case "$VAR" in
itemA) cmd;;
itemB) cmd;;
*) cmd;;
esac
item可以使用通配符
常用文件检测
- -a file :file 存在
- -d file :file存在并是一个目录
- -e file :file 存在,同- a
- -f file :file 存在并且是一个常规的文件(不是目录或者其他特殊类型文件)
- -r file :有读的权限
- -s file :文件存在且不为空
- -w file :有写的权限
- -x file :有执行的权限,或者对于目录有search的权限
- -N file :在上次读取后,文件有改动
- -O file :own所属的文件
- -G file :group所属的文件
- file1 -nt file2 :file1 比 file2 更新,以最后更新时间为准
- file1 -ot file2 :file1 比 file2 更旧 ,以最后更新时间为准
常用整数判断
- -eq 等于 if [ "$a" -eq "$b" ]
- -ne 不等于 if [ "$a" -ne "$b" ]
- -gt 大于 if [ "$a" -gt "$b" ]
- -ge 大于等于 if [ "$a" -ge "$b" ]
- -lt 小于 if [ "$a" -lt "$b" ]
- -le 小于等于 if [ "$a" -le "$b" ]
- 另外可以使用(( ))在双括号内进行C风格的比较
numa=1 numb=2 if (($numa > $numb)); then echo "$numa > $numb" else echo "$numa < $numb" fi
常用字符判断
= 等于 if [ "$a" = "$b" ]
== 等于if [ "$a" == "$b" ] 与=等价.
<小于, 按照ASCII字符进行排序
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ] 注意"<"使用在[ ]结构中的时候需要被转义.
>大于, 按照ASCII字符进行排序
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ] 注意">"使用在[ ]结构中的时候需要被转义.
-z 字符串为"null", 意思就是字符串长度为零
-n 字符串不为"null".
S=a if [ "$S" == "b" ];then echo "char is b" elif [ "$S" == "a" ];then echo "char is a" else echo "char is $S" fi
尽量使用if与then在一行的方式,否则比较容易出错。
[]中使用条件与/或需要使用-o -a 进行连接不能用&&,||,但是[[]]可以,所以还是用[[]]吧,计算上也是使用(())来的方便
函数
sayhello() { if [ $# -ge 1 ];then echo "hello $1!" else echo "hello!" fi } sayhello 'my friends'
函数调用时没有括号
参数参数通过dollar1,dollar2...获取
参考:
http://www.21andy.com/manual/advanced-bash-scripting-guide/comparison-ops.html