使用结构化命令(shell9)

20 篇文章 1 订阅

使用结构化命令

使用 if-then 语句

if-then语句有如下格式。

if command
then
commands
fi  
if command; then
commands
fi

bash shell的if语句会运行if后面的那个命令。如果该命令的退出状态码(参见第11章)是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值, then部分的命令就不会被执行, bash shell会继续执行脚本中的下一个命令。 fi语句用来表示if-then语句到此结束。

#!/bin/bash
if pwd
then
    echo "It worked"
fi

if pwd;then
    echo "It worked"
fi

if-then-else 语句

if command
then
commands
else
commands
fi

当if语句中的命令返回退出状态码0时, then部分中的命令会被执行,这跟普通的if-then语句一样。当if语句中的命令返回非零退出状态码时, bash shell会执行else部分中的命令 。

#!/bin/bash
if pwd
then
    echo "It worked"
else 
	echo "Not worked"
fi

if pwd; then
    echo "It worked"
else 
	echo "Not worked"
fi

嵌套 if

if command1
then
commands
elif command2
then
more commands
fi




if command1
then
commands
elif command2
then
more commands
elif command3
then
more commands
else
more commands
fi
#!/bin/bash

if pwd
then
	echo "pwd"
elif ls
then
	echo "ls"
elif ps
then
	echo "ps"
else
	echo "error"
fi

test 命令

到目前为止都是对命令的返回值进行测试,使用test可以对表达式进行测试。

test命令提供了在if-then语句中测试不同条件的途径。如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0。这样if-then语句就与其他编程语言中的if-then语句以类似的方式工作了。如果条件不成立, test命令就会退出并返回非零的退出状态码,这使得if-then语句不会再被执行。

test命令的格式非常简单。

test condition   


if test condition
then
commands
fi

使用test命令确定变量中是否有内容

#!/bin/bash
# Testing the test command
#
my_variable="Full"
#
if test $my_variable
then
echo "The $my_variable expression returns a True"
#
else
echo "The $my_variable expression returns a False"
fi

test命令可以判断三类条件:

  • 数值比较
  • 字符串比较
  • 文件比较
[]

bash shell提供了另一种条件测试方法,无需在if-then语句中声明test命令。

if [ condition ]
then
commands
fi

方括号定义了测试条件。注意,第一个方括号之后和第二个方括号之前必须加上一个空格,否则就会报错。

数值比较

test命令的数值比较功能

比 较描 述
n1 -eq n2检查n1是否与n2相等
n1 -ge n2检查n1是否大于或等于n2
n1 -gt n2检查n1是否大于n2
n1 -le n2检查n1是否小于或等于n2
n1 -lt n2检查n1是否小于n2
n1 -ne n2检查n1是否不等于n2
字符串比较
比 较描 述
str1 = str2检查str1是否和str2相
str1 != str2检查str1是否和str2不
str1 < str2检查str1是否比str2小
str1 > str2检查str1是否比str2大
-n str1检查str1的长度是否非0
-z str1检查str1的长度是否为0
字符串相等性
#!/bin/bash
# testing string equality
testuser=rich
#
if [ $USER = $testuser ]
then
echo "Welcome $testuser"
fi
$
$ ./test7.sh
Welcome rich
$
字符串顺序

当要开始使用测试条件的大于或小于功能时,就会出现两个经常困扰shell程序员的问题:

  1. 大于号和小于号必须转义,否则shell会把它们当作重定向符号,把字符串值当作文件名;
  2. 大于和小于顺序和sort命令所采用的不同。
文件比较
比 较描 述
-d file检查file是否存在并是一个目录
-e file检查file是否存在
-f file检查file是否存在并是一个文件
-r file检查file是否存在并可读
-s file检查file是否存在并非空
-w file检查file是否存在并可写
-x file检查file是否存在并可执行
-O file检查file是否存在并属当前用户所有
-G file检查file是否存在并且默认组与当前用户相同
file1 -nt file2检查file1是否比file2新
file1 -ot file2检查file1是否比file2旧
#检查目录
#!/bin/bash
# Look before you leap
#
jump_directory=/home/arthur
#
if [ -d $jump_directory ]
then
echo "The $jump_directory directory exists"
cd $jump_directory
ls
else
echo "The $jump_directory directory does not exist"
fi

复合条件测试

if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算符可用:

[ condition1 ] && [ condition2 ]#第一种布尔运算使用AND布尔运算符来组合两个条件。要让then部分的命令执行,两个条件都必须满足。
[ condition1 ] || [ condition2 ]#第二种布尔运算使用OR布尔运算符来组合两个条件。如果任意条件为TRUE, then部分的命令就会执行。

if [ condition1 ] && [ condition2 ]
then
commands
fi

if [ condition1 ] || [ condition2 ]
then
commands
fi

if-then 的高级特性

bash shell提供了两项可在if-then语句中使用的高级特性:

  • 用于数学表达式的双括号
  • 用于高级字符串处理功能的双方括号
使用双括号

双括号命令允许你在比较过程中使用高级数学表达式。 test命令只能在比较中使用简单的算术操作。双括号命令提供了更多的数学符号,这些符号对于用过其他编程语言的程序员而言并不陌生。双括号命令的格式如下:

#expression可以是任意的数学赋值或比较表达式。  
(( expression ))  

除了test命令使用的标准数学运算符,下表列出了双括号命令中会用到的其他运算符。

符 号描 述
val++后增
val–后减
++val先增
–val先减
!逻辑求反
~位求反
**幂运算
<<左位移
>>右位移
&位布尔和
|位布尔或
&&逻辑和
||逻辑或
使用双方括号

双方括号命令提供了针对字符串比较的高级特性。双方括号命令的格式如下:

#双方括号里的expression使用了test命令中采用的标准字符串比较。
#但它提供了test命令未提供的另一个特性——模式匹配( pattern matching)。
[[ expression ]]  

case 命令

case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac  

case命令会将指定的变量与不同模式进行比较。如果变量和模式是匹配的,那么shell会执行为该模式指定的命令。可以通过竖线操作符在一行中分隔出多个模式模式。星号会捕获所有与已知模式不匹配的值。

#!/bin/bash
# using the case command
#
case $USER in
rich | barbara)
echo "Welcome, $USER"
echo "Please enjoy your visit";;
testing)
echo "Special testing account";;
jessica)
echo "Do not forget to log off when you're done";;
*)
echo "Sorry, you are not allowed here";;
esac
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

omnibots

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值