shell语法
1.条件测试
- test和[
测试条件是否成立, 结果为真,退出码为0,否则为1(与c语言相反),不支持通配符和正则表达式
注:[ 与参数之间必须加空格
[[ ]]也可以用于条件测试,支持通配符和正则表达式
整数比较: -eq(相等)、-lt(小于)、-le(小于等于)、-gt(大于)、-ge(大于等于)、-ne(不等)
字符串比较:==(等于) !=(不等于)
$?用来判断退出码
#!/bin/bash
val=5
test $val -le 10
echo $?
[ $val -gt 10 ]
echo $?
常见的测试命令:
[ -d DIR ] DIR存在且为目录则为真
[ -f FILE ] FILE存在且为普通文件则为真
[ -z str ] str长度为0则为真
[ -n str ] str长度非0则为真
与c语言相同,测试条件之间还可以做与、或、非逻辑运算
-a(与) -o(或) !(非)
如果str没有被定义,则shell会将其看做空字符串,会造成测试条件的语法错误。
- if/then/elif/else/fi
(1)if、else支持嵌套
(2)if语句中不允许出现空的代码块
(3):也是一条命令,什么也不做但恒成立
(4)if检测语句的退出码
(5)因为没有{},所以以fi结尾
read:等待用户输入一行字符串,将该字符串存到shell变量中
read val
if [ $val -le 50 ]
then
echo "A"
else
echo "B"
fi
&&和||也可以用在if中,用来连接两个测试条件
- case和esac
shell中的case语句可以匹配字符串和正则表达式,分支以;;结尾,找到匹配的分支并执行之后直接跳到esac之后。支持通配符和正则表达式
read val
case $val in
start | -s | -a)
echo "start"
;;
[Ss]top)
echo "stop"
;;
[0-9])
echo "hello"
;;
*)
echo "***********"
esac
2.循环语句
- for/do/done
for (( i=0; i<10; i++ )) //(())括起来的内容,可以做c规范来操作
do
echo "$i"
done
for i in {0..9}
do
echo "$i"
done
- while/do/done
i=0
while [ $i -lt 10 ]
do
echo "$i"
(( i++ ))
done
- until/do/done 直到条件不成立,否则一直做这件事情
i=0
until [ $i -gt 10 ]
do
echo "$i"
let i++
done
3.位置参数和特殊变量
$0-n 命令行参数
$# 命令行参数的个数减1
$@ 命令行参数的列表
$$ 当前shell的进程号
位置参数用shift左移 如: shift 1 $3就变成$2
4.函数
(1)shell中函数必须先定义再使用
(2)函数体的 { 和后面的命令之间必须有空格或换行,最后一条命令要和 } 写在一行,则必须加‘;’
(3)定义函数时并不执行里面的命令,到后面调用时才执行
(4)关键字function可以省略,()不可以省略,代码块不能为空
//求最大最小值
function myfun(){
max=$1
min=$1
for i in $@
do
if [ $min -ge $i ]; then
min=$i
fi
if [ $max -le $i ]; then
max=$i
fi
done
}
myfun $@ //调用函数,传参
echo "max=$max"
echo "min=$min"
5.数组
(1)bash支持一维数组,不限定数组大小,下标从0开始
(2)用括号表示数组,元素用空格分隔
(3)不会越界,没有类型
例:arr=(1 3.14 ‘c’ “hello world”)
提取数组元素: ${arr[i]},使用@或*可以获取数组中所有元素
shell编写进度条
#!/bin/bash
i=0
str=""
arr=("|" "/" "-" "\\")
while [ $i -le 100 ]
do
let index=i%4
printf "[%-100s][%d%%][%c]\r" "$str" "$i" "${arr[$index]}" //printf也是一条命令
sleep 0.1
let i++
str+='#' //字符串连接
done
还有一种使用了简单配色方案的进度条
printf如下:
printf "[%-100s][%d%%][\e[54;41;1m%c\e[0m]\r" "$str" "$i" "${arr[$index]}"