您的位置:首页 > 运维架构 > Shell

shell 脚本之语法

2016-06-13 12:16 525 查看

一、条件测试

 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
}


3. case/esac

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


(2)二次扫描
[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: