条件测试
shell 条件测试0为真,1为假
test
[ ]
[[ ]]
参数之间使用空格隔开
测试命令
-d 存在且为目录
-f 存在且为普通文件
-z 字符串长度为0
-n 字符串长度非0
str1 = str2 字符串相同为真
str1 != str2 不相同为真
arg1 op arg2
-eq 相等
-ne 不等
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
逻辑操作
!
-a and
-o or
两个好的习惯
X${str1} == X${str2} 字符串比较如果一个为空,那么会错误展开,可以增加前缀防止
变量取值放在””之间,理由同上
分支
if/then/elif/else/fi
#!/bin/bash
# ##################
echo “if..else if fi”
read num
if [[ $num -eq 100 ]]; then #语句放在同一行时应当以分号隔开
#statements
echo “num=100”
elif [[ $num -lt 100 ]]; then
#statements
echo “num<100”
else
# echo “num>100”
: #空体应当是用冒号,,冒号作为一个命令,结果总是为真
fi
更好做法
[ ] && {}
或者[ ] || {}
case命令
case/esac
case $_op in
“+” )
(( sum=$num1+$num2 ))
printf “$num1 $_op $num2 = %s\n” “$sum”
;;
“+”)
:
;;
*)
;;
循环语句
do/done用于标识一个语句块的开始和结束,可以放在for行用分号隔开
#!/bin/bash
for i in {a..z}
do
echo “printf val is : $i”
done
一个例子:1+2+..+100=1050
#!/bin/bash
str=`seq 1 1 100 | tr ‘\n’ ‘+’ | sed ‘s/+$/\n/’`
printf ${str}=
echo `seq 1 1 100 | tr ‘\n’ ‘+’ | sed ‘s/+$/\n/’ | bc `
执行结果
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100=5050
另一种实现方式
sum=0
str=””
for (( i = 0; i < 101; i++ )); do
#statements
(( sum = $i + $sum))
str=$str${i}
if [[ $i -eq 100 ]]; then
#statements
break
fi
str=$str’+’
done
echo ${str}=$sum
while [ : ];do :;done
位置参数和特殊变量
$0 位置参数0
$1 …
$2 …
…
$# 相当于参数个数argc-1
$@参数列表… $1$2$3….
$* 同上
$?上一条命令的exitstatus
$$当前shell的进程号
位置参数可以使用shift命令左移(覆盖前边的n个参数)会改变$# $@
函数
函数定义
FUNCNAME(){
}
function关键字可选
函数调用eg is_dir #不需要参数,参数获取使用$@#!/bin/bash
function is_dir(){
local dir=$1
if [[ -d $dir ]]; then
#statements
return 0
else
return 1
fi
}
调试
-n 读一遍脚本中命令但不执行,用于检查脚本中的语法错误
-v
-x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来
三种方法使用
#/bin/bash -x
$ sh -x ./test.sh
在脚本中使用set -x 和 set +x 对脚本中某一段代码进行跟踪
数组
bash不支持多维数组,并且没有限定数组大小.(无越界之说)下标从0开始
定义:
array_name=(value1..valuen)
或者
array_name[0]=””
array_name[3]=””
array_name[6]=””
读取
${arrname[index]}
echo ${arr[*]}
获取字符串长度或者数组长度
i=${#arr[@]}