Linux命令行与shell脚本(8)--结构化命令
2017-04-25 10:55
627 查看
使用if-then语句
bash shell的if语句会运行if行定义的那个命令。如果该命令的退出状态码是0,位于then部分的命令就会被执行。如果该命令的退出状态码是其他值,then部分的命令就不会执行。if date then echo "it worked" fi if abc then echo "it worked again" fi echo "we are outside of if"
if-then-else 语句
#!/bin/bash testUser=nouser if grep $testUser /etc/passwd then echo $testUser are system User; else echo $testUser are not sysatUser; fi
嵌套if
可以使用 if-then-elif-then 的嵌套形式#!/bin/bash testUser=nouser if grep $testUser /etc/passwd then echo $testUser are system User; elif grep mysql /etc/passwd then echo $testUser are not system User,but mysql are system User; else echo $testUser and mysql are not system User fi
test命令
test命令可以使if语句测试跟命令的退出状态无关的条件,比如数值比较、字符串比较、文件比较。注意test命令无法处理浮点值,test命令用方括号表示test命令使用标准的数学比较符号来表示字符串比较,用文本代码来表示数值比较。如果你为数值使用了数学运算符号,shell会将它们当成字符串值,可能无法产生正常的结果
test对数值和字符串的比较:
#!/bin/bash val1=10; val2=11; testuser=chenhong; #number test if [ $val1 -gt 5 ] then echo "The test value $val1 is greater than 5"; fi if [ $val1 -eq $val2 ] then echo "The values are equal" else echo "The values are different" fi #string test if [ $USER = $testuser ] then echo "Welcom $testuser"; else echo "This is not $USER"; fi val1=baseball val2=hockey if [ $val1 \> $val2 ] #shell 也用 < 和 > 操作符进行重定向,所以必须用 \< 或 \> 加以转义 then echo $val1 is greater than $val2; else echo $val1 is less than $val2; fi val1=testing; val2=""; if [ -n "$val1" ] #val1长度是否不为0 then echo "The string '$val1' is not empty"; else echo "The string '$val1' is empty"; fi if [ -z "$val2" ] #$val2长度是否为0 then echo "The string '$val2' is empty "; else echo "The string '$val2' is not empty"; fi if [ -z "$val3" ] #$val3长度是否为0 then echo "The string '$val3' is empty "; else echo "The string '$val3' is not empty"; fi
test对文件的比较:
#!/bin/bash if [ -d $HOME ] #测试目录是否存在 then echo "Your HOME directory is exist"; cd $HOME; ls -al; else echo "Your HOME has some probolem"; fi if [ -e $HOME ] #测试文件是否存在 then echo "now check file" if [ -e $HOME/testing ] then echo "Appending date to existing file"; date >> $HOME/testing; else echo "Create new file testing"; date > $HOME/testing; fi else echo "Your HOME has some problems"; fi if [ -e $HOME ] #测试文件是否存在 then echo "The object is existed,it is a file?"; if [ -f $HOME ] #测试是否为文件 then echo "Yes,it is a file"; else echo "No, it is not a file"; fi else echo "The object is not existed"; fi pwfile="/etc/passwd"; if [ -e $pwfile ] then echo "The $file is existed"; if [ -r $pwfile ] #测试文件是否可读 then echo "I can read the file"; cat $pwfile; else echo "I can not read the file"; fi else echo "The $file is now existed"; fi if [ -s $HOME ] #检查文件是否存在且非空 then echo $HOME is existed and not empty fi logfile="$dir/log"; touch $logfile; chmod a-w $logfile; now=`date`; echo $logfile if [ -w $logfile ] #判断文件是否可写 then echo "First attemp succeeded"; echo "The program ran at : $now " >> $logfile; else echo "First attemp failed"; fi chmod a+w $logfile if [ -w $logfile ] #判断文件是否可写 then echo "Second attemp succeeded"; echo "The program ran at : $now " >> $logfile; else echo "Second attemp failed"; fi touch $HOME/test1; if [ -x $HOME/test1 ] #测试文件是否可执行 then echo "You can run $HOME/test1"; ./test1 else echo "You can not run $HOME/test1"; fi if [ -o /etc/passwd ] #判断是否为文件的属主 then echo "You are the owner of /etc/passwd file"; else echo "You are not the owner of /etc/passwd file"; fi touch test1 touch test2 touch test3 if [ ./test2 -nt ./test1 ] #判断test2是否比test1新 then echo "test2 is newer than test1"; else echo "test2 is older than test1"; fi if [ ./test2 -ot ./test3 ] #判断test2是否比test3旧 then echo "test2 is older than test3"; else echo "test2 is newer than test3"; fi
复合条件测试
可以使用&&和
||组合复合条件
#!/bin/bash if [ -e $HOME/testing ] && [ -w $HOME/testing ] #文件存在并且可写 then echo "You can write to the file"; fi
if-then的高级特性
双圆括号,允许将高级数学表达式放入比较重,也可以在脚本中的普通命令里使用来赋值#!/bin/bash val1=10 if (( $val1**2 > 90 )) then (( val2 = $val1 ** 2 )); echo "The square of $val1 is $val2"; fi
双方括号命令提供了针对字符串比较的高级特性,可以使用正则表达式
#!/bin/bash if [[ $USER == c* ]] then echo "Hello $USER"; else echo "Sorry, i do not know you "; fi
case命令
#!/bin/bash case $USER in rich | chenhong) #值为rich或 chenhong echo "Welcome, dear $USER";; testing) #值为testing echo "Welcome, test";; *) #不满足上面两个的其他值 echo "Welcome ,everyone";; esac
for命令
#!/bin/bash for test in Alabama Alaks Alibaba Arizona do echo The next state is $test; done echo The last state is $test; #The last state is Arizona for test in I don\'t know if this\'ll work #转义 do echo The word is $test; done for test in Nevada "New Hampshire" "New York" do echo going to $test done list="Alabama Alaks Alibaba Arizona"; for state in $list do echo "The next state $state"; done
默认情况下,bash shell会将下列字符当作字段分隔符: 空格、制表符、换行符。 如果bash shell在数据中看到这些字符中的任意一个,它就会假定你在列表中开始了一个新的数据段。可以修改
ISF的值来修改字段分割符,如
ISF=$'\n' #修改字段分割符为换行符
C语言风格的for命令
#!/bin/bash for (( i=1; i <= 10; i++ )) do echo "The next number is $i"; done
while命令
#!/bin/bash var1=10 while [ $var1 -gt 0 ] do echo $var1; var1=$[ $var1 - 1 ]; done
在含有多个命令的while语句中,在每次迭代中所有的测试命令都会被执行
until命令
#!/bin/bash var1=100 until [ $var1 -eq 0 ] do echo $var1; var1=$[ $var1 - 25 ]; done
嵌套循环
#!/bin/bash for (( a=1; a <= 3 ; a++ )) do echo "a : $a"; for (( b=1; b <= 3 ; b++ )) do echo " b : $b"; done done var1=3 until [ $var1 -eq 0 ] do echo "Outer loop:$var1" var2=1 while [ $var2 -lt 5 ] do var3=`echo "scale=4; $var1 / $var2 " | bc` echo " Inner loop: $var1 / $var2 = $var3" var2=$[ $var2 + 1 ] done var1=$[ $var1 - 1 ]; done
循环处理文件数据
#!/bin/bash IFS.OLD=$IFS; IFS=$'\n'; for entry in `cat /etc/passwd` do echo "the entry: - "; IFS=":"; for item in $entry do echo " $item"; done done IFS=IFS.OLD;
控制循环
break 命令#!/bin/bash for (( a=1 ; a < 4 ; a++ )) do echo "Outer loop $a"; for (( b=1; b < 100 ; b++ )) do echo " Inner loop $b"; if (( $b >4 )) then break 2 #跳出两层循环 fi done done
continue 命令
处理循环的输出
for循环处理结果重定向到 output.txt“`
!/bin/bash
for file in HOME/∗doif[−d“file” ]then
echo “’file′isadirectory“;elif[−f“file” ]
then
echo “’file′isafile”;fidone>HOME/output.txt
相关文章推荐
- Linux命令行与shell脚本编程-part1-基本bash shell命令
- Linux-Shell脚本编程-学习-5-Shell编程-使用结构化命令-if-then-else-elif
- Linux-Shell脚本编程-学习-6-Shell编程-使用结构化命令-文件比较-case编程
- Linux下命令在命令行执行正常,放到脚本文件执行出错
- linux 通过shell脚本在本地执行远程机器命令
- Linux命令行与shell脚本编程-Part1-shell终端
- Linux命令行与shell脚本(4)--Linux文件权限
- Linux命令行与shell脚本(9)--函数参数
- Shell脚本编程——了解你的Linux系统必须掌握的20个命令
- Linux命令行与shell脚本(13)--在函数中使用普通变量
- Linux命令行与shell脚本(19)--实例:监测磁盘空间
- Linux下shell脚本export命令
- linux 基础 shell脚本命令
- 如何在java程序中调用linux命令或者shell脚本?
- Shell脚本编程基础 四 更多的结构化命令
- shell脚本命令 运行python文件&python命令行运行python代码
- java 执行linux命令或shell脚本方法
- Linux下Shell脚本中几种基本命令的替换区别
- Linux系统命令及Shell脚本学习笔记一:Linux简介
- php 执行linux命令,shell脚本函数,获取服务器运行状态值