传递参数:
./test.sh 1 2 3
$0执行的脚本名./test.sh
$1传入的第一个参数1
$2传入的第二个参数2
$*传入参数汇总为一个字符串"1 2 3"
$@传入参数分割为多个字串“1” “2” “3”
$#传入参数个数3
$?最后一次命令返回值0表示没错误
数组:
array=(1 2 3)
array[0]=0
array[1]=1
array[2]=2
array[4]=4
第3个元素=$array[2]
数组元素个数=${#array[*]}4注意是4个,并不是5个
数组元素个数=${#array[@]}
计算数组元素个数时,如果中间某个为空,则不计数
运算符:
数学运算+ - * / = == !=`expr $a \* $b`注意*需要转义
关系运算-eq -nq -gt -lt -ge -le分别为=equal !=not equal >greater then <less then >=greater then or equal <=less then or equal 注意:不能用> < 作比较,会被当作重定向处理!
逻辑运算-a -o ! && || and or 非 and or 注意&& || 需要用双方括号[[ ... && ... ]]
字符运算= != -z -n str本身相等 不等 长度为0 长度不为0 字串是否为空
文件运算-b -c -d -e -f -p -s -r -w -x block块设备文件 char字符设备 dir文件夹 exist文件存在 file普通文件 pipe有名管道文件 size文件大小是否为0 read write execute
echo:
-e开启转义(默认不开启)
-c不换行执行命令
``原样输出,不进行变量替换
printf:
printf "%-10s %-4.2f \t \v \n \b \\" 小明 46.5656
左对齐宽度为10
浮点左对齐,保留两位小数
水平tab
垂直tab
换行
退格
\
控制流程:
if [ ];then
echo ""
eif [ ];then
echo ""
else
echo ""
fi
for i in array;do
echo $i
done
while (($a < 10));do
let "a++"
if [ $a -eq 5 ];then
continue #本次循环结束,进行下一次
elif [ $a -eq 8 ];then
break #退出循环
fi
done
while true;do
echo ""
done
for ((;;));do
echo ""
done
until [ $a -eq 4 ];do
echo ""
done
case $a in #注意不要落下in
1) echo "" #格式:条件+)
;; #两个分号相当于break
2) echo ""
;;
*) echo "not found" #*)相当于default
;;
esac
函数:
func_name() {
echo "第一个参数=$1"
echo "第十个参数=${10}" #注意>=10时要加大括号
echo "参数个数=$#"
a=123
return $a
}
func_name 1 2 3 4 5 6 7 8 9 10 #函数调用
echo $? #输出123,$?打印函数返回值
重定向:
把标准输出重定向到null文件,同时把标准错误也合并到标准输出,null文件的意义为相当于把stdout和stderr直接丢弃
./test.sh > /dev/null 2>&1
把标准错误和标准输出,打印到终端里,同时记录到out.log中
./test.sh 2>&1 |tee out.log
例1:解压目录下所有.tar.gz压缩包到各自目录下
for file in *
do
extName=${file##*.}
if [ $extName == "gz" -o $extName == "tar" ];then
basename=${file%%.*}
destDir="`pwd`/${basename}/"
echo "decompression ${file} to ${destDir}"
mkdir -p ${destDir}
tar -xf $file -C ${destDir}
else
echo "do nothing."
fi
done
备注:${file%%.*} 去掉第一个匹配.*的右侧的所有字符(%在$右侧,1个%就是最后一个,2个%就是第一个)
${file##*.} 去掉最后一个匹配*.的左侧的所有字符(#在$左侧,1个%就是第一个,2个%就是最后一个)
例2:遍历所有的 /dev/sd? 设备,查找大小为8G的设备结点
func2()
{
for dev in `ls /dev/sd?`
do
size=`sudo lsblk ${dev} |sed -n 2p |awk '{print $4}'`
if [ "${size}" == "50G" ]; then
echo "find ${dev} is 50G"
fi
done
}