我们在读取用户的正常输入后,很有可能会将这些输入信息用于条件判断,那么在进行比较时,我们将不得不考虑这些信息的大小写匹配问题。 /> cat > test1.sh #!/bin/sh echo -n "Please let me know your name. " read name #将变量name的值通过管道输出到tr命令,再由tr命令进行大小写转换后重新赋值给name变量。 name=`echo $name | tr [a-z] [A-Z]` if [[ $name == "STEPHEN" ]]; then echo "Hello, Stephen." else echo "You are not Stephen." fi CTRL+D /> ./test1.sh Please let me know your name. stephen Hello, Stephen.
二、为调试信息设置输出级别:
我们经常在调试脚本时添加一些必要的调试信息,以便跟踪到程序中的错误。在完成调试后,一般都会选择删除这些额外的调试信息,在过了一段时间之后,如果脚本需要添加新的功能,那么我们将不得不重新进行调试,这样又有可能需要添加这些调试信息,在调试成功之后,这些信息可能会被再次删除。如果我们能够为我们的调试信息添加调试级别,使其只在必要的时候输出,我想这将会是一件非常惬意的事情。 /> cat > test2.sh #!/bin/sh if [[ $# == 0 ]]; then echo "Usage: ./test2.sh -d debug_level" exit 1 fi #1. 读取脚本的命令行选项参数,并将选项赋值给变量argument。 while getopts d: argument do #2. 只有到选项为d(-d)时有效,同时将-d后面的参数($OPTARG)赋值给变量debug,表示当前脚本的调试级别。 case $argument in d) debug_level=$OPTARG ;; ?) echo "Usage: ./test2.sh -d debug_level" exit 1 ;; esac done #3. 如果debug此时的值为空或者不是0-9之间的数字,给debug变量赋缺省值0. if [[ -z $debug_level || $debug_level != [0-9] ]]; then debug_level=0 fi echo "The current debug_level level is $debug_level." echo -n "Tell me your name." read name name=`echo $name | tr [a-z] [A-Z]` if [ $name = "STEPHEN" ];then #4. 根据当前脚本的调试级别判断是否输出其后的调试信息,此时当debug_level > 0时输出该调试信息。 test $debug_level -gt 0 && echo "This is stephen." #do something you want here. elif [ $name = "ANN" ]; then #5. 当debug_level > 1时输出该调试信息。 test $debug_level -gt 1 && echo "This is ann." #do something you want here. else #6. 当debug_level > 2时输出该调试信息。 test $debug_level -gt 2 && echo "This is others." #do any other else. fi CTRL+D /> ./test2.sh Usage: ./test2.sh -d debug_level /> ./test2.sh -d 1 The current debug level is 1. Tell me your name. ann /> ./test2.sh -d 2 The current debug level is 2. Tell me your name. ann This is ann.
三、判断参数是否为数字:
有些时候我们需要验证脚本的参数或变量的值是否为数字,如果不是需要给出提示,并退出脚本。 /> cat > test3.sh #!/bin/sh #1. $1是脚本的第一个参数,这里作为awk命令的第一个参数传入给awk命令。 #2. 由于没有输入文件作为输入流,因此这里只是在BEGIN块中完成。 #3. 在awk中ARGV数组表示awk命令的参数数组,ARGV[0]表示命令本身,ARGV[1]表示第一个参数。 #4. match是awk的内置函数,返回值为匹配的正则表达式在字符串中(ARGV[1])的起始位置,没有找到返回0。 #5. 正则表达式的写法已经保证了匹配的字符串一定是十进制的正整数,如需要浮点数或负数,仅需修改正则即可。 #6. awk执行完成后将结果返回给isdigit变量,并作为其初始化值。 #7. isdigit=`echo $1 | awk "{ if (match($1, "^[0-9]+$") != 0) print "true"; else print "false" }" ` #8. 上面的写法也能实现该功能,但是由于有多个进程参与,因此效率低于下面的写法。 isdigit=`awk "BEGIN { if (match(ARGV[1],"^[0-9]+$") != 0) print "true"; else print "false" }" $1` if [[ $isdigit == "true" ]]; then echo "This is numeric variable." number=$1 else echo "This is not numeric variable." number=0 fi CTRL+D /> ./test3.sh 12 This is numeric variable. /> ./test3.sh 12r This is not numeric variable.
四、判断整数变量的奇偶性:
为了简化问题和突出重点,这里我们假设脚本的输入参数一定为合法的整数类型,因而在脚本内部将不再进行参数的合法性判断。 /> cat > test4.sh #!/bin/sh #1. 这里的重点主要是sed命令中正则表达式的写法,它将原有的数字拆分为两个模式(用圆括号拆分),一个前面的所有高位数字,另一个是最后一位低位数字,之后再用替换符的方式(2),将原有数字替换为只有最后一位的数字,最后将结果返回为last_digit变量。 last_digit=`echo $1 | sed "s/(.*)(.)$/2/"` #2. 如果last_digit的值为0,2,4,6,8,就表示其为偶数,否则为奇数。 case $last_digit in 0|2|4|6|8) echo "This is an even number." ;; *) echo "This is not an even number." ;; esac CTRL+D /> ./test4.sh 34 This is an even number. /> ./test4.sh 345 This is not an even number.