Linux Shell编程学习笔记(4)
2015-07-22 13:40
776 查看
Linux Shell编程学习笔记(2015-7-20)
分类:linux shell
今天学习了Linux Shell中的控制结构。其实大多数语言的控制结构这一块都是基本类似的,有了C语言的基础之后,对于shell中的控制结构是可以很快掌握的。一:条件测试
在C语言中无论是while,do…while,for这些控制语句里都含有条件测试语句。可以说在控制开始或者控制过程中条件测试都是必不可少的部分。1.test命令
条件测试命令test用于评估表达式的值以便进行条件控制。test命令有两种书写格式。分别如下:test 表达式
或者
[ 表达式 ]
test命令评估表达式参数,如果表达式的值为真,其退出状态为0(成功),否则退出状态为1(失败)。
注意:使用方括号时,“[”右边和“]”左边各需要至少一个空格。
比如:
biantiao@lazybone1994-ThinkPad-E430:~$ cd sh biantiao@lazybone1994-ThinkPad-E430:~/sh$ test "3" \> "2" ; echo $? 0 biantiao@lazybone1994-ThinkPad-E430:~/sh$ test "2" \> "3" ; echo $? 1 biantiao@lazybone1994-ThinkPad-E430:~/sh$
test命令可以和多种系统运算符一起使用。这些运算符可以分成4类:文件属性测试运算符,字符串测试运算符,数值测试运算符和逻辑测试运算符。至于这些具体的测试运算符是没有必要去记忆的,在实际的编程中遇到了直接去查阅手册就好了。
2.let命令
test命令很强大,但只能执行算术比较运算且书写繁琐,为此,bash提供了专门执行整数算术运算的let命令,其语法格式为:let 算术表达式..
或者
((算术表达式))
如果算术表达式求值为0,则设置退出状态为1;如果求值为0值,则退出状态为0。比如:
biantiao@lazybone1994-ThinkPad-E430:~$ let x=2 y=2**3 z=y*3 ; echo $? $x $y $z 0 2 8 24 biantiao@lazybone1994-ThinkPad-E430:~$let x=8%2 ; echo $? $x 1 0
let命令除了提供了基本的算术运算符外,它还提供了几个C语言中没有的运算符如下表所示:
注明:因为按位或的符号在Markdown中无法被转义,故用的中文来说明。感觉自己好low啊! o(╯□╰)o 如果谁有好的办法还请告知我,感激不尽!
运算符 | 功能 |
---|---|
! | 逻辑非 |
~ | 按位取反 |
& | 按位与 |
^ | 按位异或 |
就是一条竖线 | 按位或 |
- 使用(())形式时,即使表达式中有shell的特殊字符,也不必用双引号将其括起来。比如:
biantiao@lazybone1994-ThinkPad-E430:~$ let "v = 6 | 5" ; echo $v 7 biantiao@lazybone1994-ThinkPad-E430:~$ let v = 6 | 5 ; echo $v bash: let: =: 语法错误: 需要操作数 (错误符号是 "=") 5:未找到命令 7 biantiao@lazybone1994-ThinkPad-E430:~$ ((v = 6 | 5)) ; echo $v 7 biantiao@lazybone1994-ThinkPad-E430:~$
使用“$((表达式))”形式可以返回算术表达式的确切值,而不是let命令的退出码。并将其返回值赋值给其它变量。例如:
biantiao@lazybone1994-ThinkPad-E430:~$ v=$((1 + 2)) ; echo $? ; echo $v 0 3 biantiao@lazybone1994-ThinkPad-E430:~$
3.“[[ ]]”测试
同“(( ))”一样,该命令可以对文件名和字符串使用更自然的语法,其中的特殊字符不用转义。在该命令中,还允许使用括号和逻辑操作符“&&”和“||”把test命令支持的测试组合起来。比如:biantiao@lazybone1994-ThinkPad-E430:~$ [[ ( -d "$HOME" ) && ( -w "$HOME" ) ]] && echo "home is a writable dir ectory" home is a writable dir ectory biantiao@lazybone1994-ThinkPad-E430:~$
二:控制语句
shell的控制语句所完成的功能与C语言中的控制语句相同,唯一的区别是它们的表达形式不一样。if语句
if 测试条件1 then 命令组1 [elif 测试条件2] [then 命令组2] [else 命令x] fi
说明:其中在方括号中的是可选的,按需选择。举个例子:
biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat if.sh #! /bin/bash echo 'type in the user name.' read user if grep $user /etc/passwd > /tmp/null && who | grep $user then echo "$user has logged in the system" cp /tmp/null ~/me.tmp rm /tmp/null else echo "$user has not logged in the system" fi biantiao@lazybone1994-ThinkPad-E430:~/sh$ chmod a+x if.sh biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./if.sh type in the user name. biantiao biantiao :0 2015-07-20 07:25 (:0) biantiao pts/3 2015-07-20 13:34 (:0.0) biantiao has logged in the system biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./if.sh type in the user name. lazybone1994 lazybone1994 has not logged in the system biantiao@lazybone1994-ThinkPad-E430:~/sh$
case语句
case 字符串 in 模式字符串1) 命令 命令 命令 ... 命令;; 模式字符串2) 命令 命令 命令 ... 命令;; ... 模式字符串n) 命令 命令 命令 ... 命令;; esac
比如:
biantiao@lazybone1994-ThinkPad-E430:~$ cd sh biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat case.sh #! /bin/bash echo "Pleae input the file name." read name echo "Please chose either 1, 2 or 3." echo "[1]ls -l $name" echo "[2]cat $name" echo "[3]quit" read response case $response in 1) ls -l $name;; 2) cat $name;; 3) echo "good bye." esac biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./case.sh Pleae input the file name. case.sh Please chose either 1, 2 or 3. [1]ls -l case.sh [2]cat case.sh [3]quit 2 #! /bin/bash echo "Pleae input the file name." read name echo "Please chose either 1, 2 or 3." echo "[1]ls -l $name" echo "[2]cat $name" echo "[3]quit" read response case $response in 1) ls -l $name;; 2) cat $name;; 3) echo "good bye." esac biantiao@lazybone1994-ThinkPad-E430:~/sh$
说明:模式字符串可以使用通配符。如果一个模式字符串中包含了多个模式,那么各模式之间应该以竖线隔开(|)表示各模式是“或”的关系。比如:
biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat m.sh #! /bin/bash read choice case $choice in time | date) echo "the time is `date`.";; dir | path) echo "current directory is `pwd`.";; *) echo "bad argument." esac biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./m.sh time the time is 2015年 07月 20日 星期一 14:00:10 CST. biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./m.sh date the time is 2015年 07月 20日 星期一 14:00:17 CST. biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./m.sh dir current directory is /home/biantiao/sh. biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./m.sh path current directory is /home/biantiao/sh. biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./m.sh kkh bad argument. biantiao@lazybone1994-ThinkPad-E430:~/sh$
while语句
while 测试条件 do 命令表 done
until语句
until 测试条件 do 命令表 done
说明:until语句与while语句很相似,只是测试条件不同。until语句中,只有当测试条件为假时才执行循环体中的命令表,直到测试条件为真时终止循环。
for语句
for语句的值表达方式
for 变量 [in 值表] do 命令表 done
举个例子:
biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat for.sh #! /bin/bash student=(张三 李四 王五 LazyBone1994) for name in "${student[@]}" do echo $name done biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./for.sh 张三 李四 王五 LazyBone1994 biantiao@lazybone1994-ThinkPad-E430:~/sh$
for语句的算术表达方式
说明:该方式和C语言当中的for语句及其类似。for ((e1; e2; e3)) ; do 命令表 done
举个例子:
biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat for1.sh #! /bin/bash echo "输入要打印的行数:" read n for ((i = 1; i <= n; i++)) ; do for ((j = 1; j <= i; j++)) ; do echo -n "* " done echo "" done biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./for1.sh 输入要打印的行数: 6 * * * * * * * * * * * * * * * * * * * * * biantiao@lazybone1994-ThinkPad-E430:~/sh$
break,continue和exit语句
break命令的作用是退出循环体,其语法格式是:break
说明:其中n为一整数,表示要跳出几层循环。
continue命令的作用是跳过本次循环中在它之后的循环体语句,回到本层循环的开头,进行下一次循环。其语法是:
continue
说明:其中n表示包含continue语句的最外层循环体向外跳出基层循环,默认值为1.
exit命令的功能是立即退出正在执行的shell脚本,并设定退出状态。其语法格式为:
exit
说明:n是设定的退出状态。如果未显示给出n值,则退出状态为最后一个命令的执行状态。
相关文章推荐
- Linux Shell编程学习笔记(3)
- Linux Shell编程学习笔记(2)
- centos下-bash: pecl: command not found的解决方法
- shell几种字符串加密解密的方法
- bash no such file or directory in ubuntu 1404
- 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od(转)
- shell脚本
- 基于CentOS的Mysql学习补充二--使用Shell创建数据库
- shell自动打包ipa
- shell export 作用
- Shell-循环语句
- shell tr命令
- SHELL 脚本链接数据库示例
- linux shell bash使用管道|和read结合时问题解决
- linux shell bash使用管道|和read结合时问题解决
- 我的一些简单的shell脚本实例
- 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od
- 基本shell编程【2】-服务端发布脚本
- hbase常用的shell命令例子
- shell获取IP地址