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
相关文章推荐
- shell一则-按文件每行长度排序
- shell中的eval命令
- shell编程中for file in $*; do是什么意思.
- xshell和Idea常用快捷键=>常用的哟!
- linux中shell变量$#,$@,$0,$1,$2的含义解释
- shell awk 入门
- 嵌入式Linux裸机开发(十六)——shell实现
- shell脚本小工具之万能解压和压缩器---实现思路
- 工作脚本处理文本shell
- bashrc和profile的区别
- 远程执行shellcode
- Shell命令
- 使用shell实现对xml文件的指定字段进行修改,默认替换成当时的时间戳
- [Android]使用BeanShell实现Android简易科学计算器
- HBase 常见Shell命令总结
- shell变量的简单说明
- 浅谈shell—eval
- shell 基础 $(cd `dirname $0`;pwd)
- shell 脚本
- shell实现ftp命令示例