一、条件测试
1、test和[
[root@www SHELL]# cat shell.sh
#!/bin/bash
val=10
test $val -gt 9 //test 传给各命令的参数之间用空格隔开
echo $?
test $val -gt 10
echo $?
[ $val -gt 9 ] // [
echo $?
[ $val -gt 10 ]
echo $?
[root@www SHELL]# chmod +x shell.sh
[root@www SHELL]# ./shell.sh //测试结果为真,则该命令的Exit Status为0
0
1
0
1
测试命令[ -d DIR ] : 如果DIR存在并且是一个目录则为真
[ -f FILE ] : 如果FILE存在且是一个普通文件则为真
[ -z STRING ] : 如果STRING的长度为零则为真
[ -n STRING ] : 如果STRING的长度非零则为真
[ STRING1 = STRING2 ] : 如果两个字符串相同则为真
[ STRING1 != STRING2 ] : 如果字符串不相同则为真
[root@www SHELL]# cat shell.sh
#!/bin/bash
read str
[ -d "$str" ] //判断该目录是否存在并且该目录为真 ($_str变量事先没有定义,则被Shell展开为空字符串,会造成测试条件的语
法错误,所以把变量取值放到""中)
echo $?
[ -f "$str" ] //判断文件存在是否为普通文件
echo $?
[ "X$str" == "X" ] // 判断字符串是否为空
echo $?
[ -z "$str" ] //判断该字符串长度为0
echo $?
[ ! -z "$str" ] //逻辑非
echo $?
[ -n "$str" ] //判断该字符串长度不为0
echo $?
[ "X$str" != "Xhello" ] // 判断两个字符串是否相等,最好在字符串前面加上一个字符
echo $?
测试结果:
[root@www SHELL]# ./shell.sh
1
1
0
0
1
1
0
[root@www SHELL]# ./shell.sh
lalal
1
1
1
1
0
0
0
[root@www SHELL]# ./shell.sh
shell.sh
1
0
1
1
0
0
0
$@:
$?: 0
$$: 3348
2. if/then/elif/else/fi
[root@www SHELL]# cat shell.sh
#!/bin/bash
read name
read score
if [ $score -ge 90 ];then //if条件
echo "$name,you are excellent"
elif [ $score -ge 80 -a $score -lt 90 ];then //逻辑与,两条命令写在一行上,用分号隔开
echo "$name,you are good"
elif [ $score -ge 60 -a $score -lt 80 ];then
echo "$name,you passed"
else
echo "gou out"
fi
[root@www SHELL]# ./shell.sh
lala
65
lala,you passed
[root@www SHELL]# cat shell.sh
#!/bin/bash
read name
read score
[ $score -gt 90 ] && { echo "$name,you are good" // &&相当于if..then,连接两个命令
}
[ $score -gt 90 ] || { echo "$name, you are a little good" // || 相当于if not... then
}
case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语言的case只能匹配整型或字符型常量表达式, 而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干 条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳 到esac之后,不需要像C语言一样用break跳出。
[root@www SHELL]# cat shell.sh
read val
case $val in
"hello")
echo "hi"
;;
"nihao")
echo "nihao"
;;
*)
echo "*"
;;
esac
[root@www SHELL]# ./shell.sh
hello
hi
[root@www SHELL]# ./shell.sh
nihao
nihao
[root@www SHELL]# ./shell.sh
ni
*
二、循环语句
1、for/do/done
[root@www SHELL]# cat shell.sh
#!/bin/bash
#for i in {a..z}
#do
# echo " val is: $i"
#done
sum=0
for ((i=0; i<=100;i++ )) //类c方式
do
let sum+=i
done
echo "sum is $sum"
2、while/do/done和until/do/done
[root@www SHELL]# cat shell.sh
#!/bin/bash
#sum=0
#i=0
#while [ $i -le 100 ]
#do
#let sum+=i
# let i++
#done
#echo $sum
sum=0
i=0
until [ $i -gt 100 ]
do
let sum+=i
let i++
done
echo $sum
3、位置参数和特殊变量
[root@www SHELL]# cat shell.sh
#!/bin/bash
echo '$0:' $0 //相当于c函数中的argv[0]
echo '$1:' $1 //argv[1]
echo '$2:' $2 //argv[2]
echo '$#:' $# //argc
echo '$@:' $@ //表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
echo '$?:' $?
echo '$$:' $$ //当前shell进程号
[root@www SHELL]# cat shell.sh
#!/bin/bash
echo '$0:' $0
echo '$1:' $1
echo '$2:' $2
echo '$#:' $#
echo '$@:' $@
echo '$?:' $?
echo '$$:' $$
shift 1 // 位置参数用shift左移
echo '$0:' $0
echo '$1:' $1
echo '$2:' $2
echo '$#:' $#
echo '$@:' $@
echo '$?:' $?
echo '$$:' $$
[root@www SHELL]# ./shell.sh wo ni
$0: ./shell.sh
$1: wo
$2: ni
$#: 2
$@: wo ni
$?: 0
$$: 15752
$0: ./shell.sh
$1: ni
$2:
$#: 1
$@: ni
$?: 0
$$: 15752
[root@www SHELL]# cat shell.sh
#!/bin/bash
case "$1" in // $1相当于argv[1]
start | -s | -S )
echo "your cmd is start"
;;
st[oO]p )
echo "your cmd is stop"
;;
restart )
echo "your cmd is restart"
;;
* )
echo "your cmd is default"
;;
esac
[root@www SHELL]# ./shell.sh start
your cmd is start
[root@www SHELL]# ./shell.sh s
your cmd is default
[root@www SHELL]# ./shell.sh -s
your cmd is start
[root@www SHELL]# ./shell.sh -S
your cmd is start
[root@www SHELL]# ./shell.sh stOP
your cmd is default
[root@www SHELL]# ./shell.sh stOp
your cmd is stop
4、 函数
[root@www SHELL]# cat shell.sh
#!/bin/bash
sum=0
function add() { //函数定义时没有参数也没有返回值
echo "this is a function !arg1:$1,arg2:$2"
let sum=$1+$2 // 调用参数时可以传任意个参数,通过$0、$1、$2传参
echo $sum
return 0 //返回的是退出码
}
#add 100 200
res=$(add 100 200)
echo "res:$res"
5、eval命令(Linux)
shell中的eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。
(1)eval用于回显变量
[root@www SHELL]# COUNT=10
[root@www SHELL]# eval echo $COUNT //等价于 echo $COUNT
10
[root@www SHELL]# echo $COUNT
10
[root@www SHELL]# val="cat test"
[root@www SHELL]# eval $val // 第一次扫描把变量进行了置换,第二次扫描执行该字符串中的命令
we are young
[root@www SHELL]# echo $val
cat test
(3) 命令还可以用来显示出传递给脚本的最后一个参数
[root@www SHELL]# echo "last argument is $(eval echo \$$#)" //第一次扫描解析成参数个数,第二次得出最后一个参数
last argument is bash
[root@www SHELL]# echo "last argument is $(eval echo $#)"
last argument is 0