Linux随笔4
2015-08-11 13:18
603 查看
数值测试
有6种数值比较测试可供使用。
如果两数相等,-eq返回真;
如果不相等,-ne返回真;
-lt与-gt分别用于测试两个数的小于与大于关系。
如果要测试小于或者等于关系,可以使用-le;
-ge测试大于或等于的关系。
组合测试
可以使用&&和||操作符来将测试组合起来。他们分别实现测试的逻辑与和逻辑或。要测试一个文件是否可读且大小不为0,可以组合-r和-s测试。在本例中,哪个测试失败都没有关系;除非两个条件都为真,否则计算文件文件的md5sum就没有意义。/etc/hosts通常可读且不为空,所以下面的脚本默认参数为/etc/hosts。 /etc/shadow通常也不为空,但除非是root用户或者在shadow组中,否则它是不可读的,所以不可能计算它的md5sum。
可以通过首先执行速度最快或者最可能失败的测试来提高脚本的运行速度。
短路语句:
短路语句举例:
case
case提供了一种更加清晰,易于编写以及更具可读性的代替if/then/else的结构,尤其是在对多个值进行测试的情况下。在case语句中,我们列出要识别以及要操作的值,然后为每个值提供一个代码块。基本的case块如下所示:
使用通配符:
如果设置了nocasematch,则没有必要重复大小写,因为大小写不区分。
关于case的bash实现的一个鲜为人知的特性是:可以使用;;&或;&而不是;;来终止语句,如果使用;&终止语句,则认为接下来的模式已经匹配。下例中,如果在语句末尾使用;;&表示需要继续执行测试。
有6种数值比较测试可供使用。
如果两数相等,-eq返回真;
如果不相等,-ne返回真;
-lt与-gt分别用于测试两个数的小于与大于关系。
如果要测试小于或者等于关系,可以使用-le;
-ge测试大于或等于的关系。
[root@localhost tmp]# cat numberguess.sh #!/bin/bash MAX=50 guess=-1 let answer=($RANDOM % MAX) let answer+=1 ceiling=$MAX floor=0 guesses=0 while [ "$guess" -ne "$answer" ] do echo "The magic number is between $floor and $ceiling ." echo -en "Make your guess: " read guess guesses=`expr $guesses + 1` if [ "$guess" -lt "$answer" ]; then echo "$guess is too low" if [ "$guess" -gt "$floor" ]; then floor=`expr $guess + 1` fi fi if [ "$guess" -gt "$answer" ];then echo "$guess is too high" if [ "$guess" -lt "$ceiling" ]; then ceiling=`expr $guess - 1` fi fi done echo "Your got it in $guesses guesses!" [root@localhost tmp]#
组合测试
可以使用&&和||操作符来将测试组合起来。他们分别实现测试的逻辑与和逻辑或。要测试一个文件是否可读且大小不为0,可以组合-r和-s测试。在本例中,哪个测试失败都没有关系;除非两个条件都为真,否则计算文件文件的md5sum就没有意义。/etc/hosts通常可读且不为空,所以下面的脚本默认参数为/etc/hosts。 /etc/shadow通常也不为空,但除非是root用户或者在shadow组中,否则它是不可读的,所以不可能计算它的md5sum。
[root@localhost tmp]# cat md5-if-possible.sh #!/bin/bash filename=${1:-/etc/hosts} if [ -r "$filename" ] && [ -s "$filename" ]; then md5sum $filename else echo "$filename cannot be processed" fi #Show the file if possible ls -ld $filename 2>/dev/null [root@localhost tmp]# [root@localhost tmp]# ./md5-if-possible.sh /etc/shadow ed6adcb3ff9b0e2f0d48f4b4b9297fc4 /etc/shadow ----------. 1 root root 955 7月 30 10:41 /etc/shadow [root@localhost tmp]# ./md5-if-possible.sh /etc/hosts 54fb6627dbaa37721048e4549db3224d /etc/hosts -rw-r--r--. 2 root root 158 8月 5 16:07 /etc/hosts [root@localhost tmp]#
可以通过首先执行速度最快或者最可能失败的测试来提高脚本的运行速度。
短路语句:
[root@localhost tmp]# cat readable-and.sh #!/bin/bash filename=${1:-/etc/hosts} [ -r $filename ] && echo "$filename is readable" [root@localhost tmp]# [root@localhost tmp]# ./readable-and.sh /etc/hosts /etc/hosts is readable [root@localhost tmp]# ./readable-and.sh /etc/shadow /etc/shadow is readable [root@localhost tmp]#
短路语句举例:
[root@localhost tmp]# wc -l /etc/hosts || echo "wc failed to read /etc/hosts" 2 /etc/hosts [root@localhost tmp]# wc -l /etc/hosts.bak || echo "wc failed to read /etc/hosts.bak" wc: /etc/hosts.bak: 没有那个文件或目录 wc failed to read /etc/hosts.bak [root@localhost tmp]# wc -l /etc/hosts| grep "^20" && echo "/etc/hosts is a 20 line file." [root@localhost tmp]# wc -l /etc/hosts| grep "^20" || echo "/etc/hosts is not a 20 line file." /etc/hosts is not a 20 line file. [root@localhost tmp]# wc -l /etc/hosts| grep "^2" || echo "/etc/hosts is a 2 line file." 2 /etc/hosts [root@localhost tmp]# wc -l /etc/hosts| grep "^2" && echo "/etc/hosts is a 2 line file." 2 /etc/hosts /etc/hosts is a 2 line file. [root@localhost tmp]#
case
case提供了一种更加清晰,易于编写以及更具可读性的代替if/then/else的结构,尤其是在对多个值进行测试的情况下。在case语句中,我们列出要识别以及要操作的值,然后为每个值提供一个代码块。基本的case块如下所示:
[root@localhost tmp]# cat fruit.sh #!/bin/bash read -p "What is your favorite fruit? : " fruit case $fruit in orange) echo "The $fruit is orange" ;; banana) echo "The $fruit is yellow" ;; pear) echo "The $fruit is green" ;; *) echo "I don't know what color a $fruit is " ;; esac [root@localhost tmp]# [root@localhost tmp]# ./fruit.sh What is your favorite fruit? : banana The banana is yellow [root@localhost tmp]# ./fruit.sh What is your favorite fruit? : apple I don't know what color a apple is [root@localhost tmp]# # cat uname-case.sh #!/bin/bash OS=`uname -s`
case "$OS" in FreeBSD) echo "This is FreeBSD" ;; CYGWIN_NT-5.1) echo "This is Cygwin" ;; SunOS) echo "This is Solaris" ;; Darwin) echo "This is Mac OSX" ;; AIX) echo "This is AIX" ;; Minix) echo "This is Minix" ;; Linux) echo "This is Linux" ;; *) echo "Failed to identify this OS" ;; esac [root@localhost]# [root@localhost 5]# ./uname-case.sh This is Linux
使用通配符:
[root@localhost 5]# cat surname.sh #!/bin/bash read -p "What is your surname?: " surname case $surname in [a-g]* | [A-G]*) file=1 ;; [h-m]* | [H-M]*) file=2 ;; [n-s]* | [N-S]*) file=3 ;; [t-z]* | [T-Z]*) file=4 ;; *) file=0 ;; esac if [ "$file" -gt "0" ]; then echo "$surname goes in file $file" else echo "I have nowhere to put $surname" fi [root@localhost 5]# [root@localhost 5]# ./surname.sh What is your surname?: Apple Apple goes in file 1 [root@localhost 5]# ./surname.sh What is your surname?: apple apple goes in file 1 [root@localhost 5]# [root@localhost 5]# ./surname.sh What is your surname?: Parker Parker goes in file 3 [root@localhost 5]# ./surname.sh What is your surname?: 'asdf I have nowhere to put 'asdf [root@localhost 5]#
如果设置了nocasematch,则没有必要重复大小写,因为大小写不区分。
关于case的bash实现的一个鲜为人知的特性是:可以使用;;&或;&而不是;;来终止语句,如果使用;&终止语句,则认为接下来的模式已经匹配。下例中,如果在语句末尾使用;;&表示需要继续执行测试。
[root@localhost 5]# cat case1.sh #!/bin/bash read -p "Give me a word: " input echo -en "You gave me some " case $input in *[[:lower:]]*) echo -en "Lowercase " ;;& *[[:upper:]]*) echo -en "Uppercase " ;;& *[[:digit:]]*) echo -en "Numerical " ;;& *) echo "input." ;; esac [root@localhost 5]# [root@localhost 5]# ./case1.sh Give me a word: hello You gave me some Lowercase input. [root@localhost 5]# ./case1.sh Give me a word: Hello You gave me some Lowercase Uppercase input. [root@localhost 5]# ./case1.sh Give me a word: HELLO You gave me some Uppercase input. [root@localhost 5]# ./case1.sh Give me a word: 123 You gave me some Numerical input. [root@localhost 5]# ./case1.sh Give me a word: Hello 123 You gave me some Lowercase Uppercase Numerical input. [root@localhost 5]# ./case1.sh Give me a word: !@# You gave me some input. [root@localhost 5]#
相关文章推荐
- Linux PHP开发环境:CentOS下配置LAMP开发环境
- Centos系统安装JDK详细图文教程
- linux 下配置vncserver
- linux yum安装软件问题
- linux 文件操作 --copy_file
- /proc/* 代表的意义
- Linux从入门到精通(一):硬盘安装Ubuntu15.04与win7双系统
- 每天一个Linux命令-12(lsof)
- Linux文件系统
- linux下 gcc 默认搜索路径
- 六款常用的linux C/C++ IDE
- Linux电源管理(11)_Runtime PM之功能描述
- Linux电源管理(10)_autosleep
- Linux电源管理(9)_wakelocks
- Linux电源管理(8)_Wakeup count功能
- linux 命令 $1 $2 $@ $*等等含义
- Linux电源管理(7)_Wakeup events framework
- Linux电源管理(6)_Generic PM之Suspend功能
- Linux NTP配置详解 (Network Time Protocol)
- Linux 用户和组编程