Shell编程—结构化命令
1使用if-then语句
f-then语句有如下格式。
if command
then
commands
fi
bash shell的if语句会运行if后面的那个命令。如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值, then部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。fi语句用来表示if-then 语句到此结束。
举例:
$ vim test1.sh
#!/bin/bash
# testing the if statement
if pwd
then
echo "It worked"
fi
命令行运行该脚本时,会得到如下结果:

此外,还有一种写法:
if command; then
commands
fi
通过把分号放在待求值的命令尾部,就可以将then语句放在同一行上了。
2 if-then-else语句
格式:
if command
then
commands
else
commands
fi
3 嵌套if
有时需要检查脚本代码中的多种条件。对此,可以使用嵌套的if-then语句。
比如要检查/etc/passwd文件中是否存在某个用户名以及该用户的目录是否尚在,可以使用嵌套的if-then语句。嵌套的if-then语句位于主if-then-else语句的else代码块中。
$ ls -d /home/NoSuchUser/
/home/NoSuchUser/
$
$ vim test5.sh
#!/bin/bash
# Testing nested ifs
testuser=NoSuchUser
if grep $testuser /etc/passwd
then
echo "The user $testuser exists on this system."
else
echo "The user $testuser does not exist on this system."
if ls -d /home/$testuser/
then
echo "However, $testuser has a directory."
fi
fi
4 test命令
test命令提供了在if-then语句中测试不同条件的途径。如果test命令中列出的条件成立, test命令就会退出并返回退出状态码0。如果条件不成立,test命令就会退出并返回非零的退出状态码,使得if-then语句不会再被执行。
test命令的格式非常简单:
test condition
当用在if-then语句中时,test命令看起来是这样的:
if test condition
then
commands
fi
如果不写test命令的condition部分,它会以非零的退出状态码退出,并执行else语句块:
$ vim test6.sh
#!/bin/bash
# Testing the test command
if test
then
echo "No expression returns a True"
else
echo "No expression returns a False"
fi
执行结果:

4.1数值比较
|
比 较 |
描 述 |
|
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 |
举例:
$ vim numeric_test.sh
#!/bin/bash
# Using numeric test evaluations
value1=10
value2=11
if [ $value1 -gt 5 ]
then
echo "The test value $value1 is greater than 5"
fi
if [ $value1 -eq $value2 ]
then
echo "The values are equal"
else
echo "The values are different"
fi
第一个条件测试:
if [ $value1 -gt 5 ] : 测试变量value1的值是否大于5。
第二个条件测试:
if [ $value1 -eq $value2 ] : 测试变量value1的值是否和变量value2的值相等
结果:

4.2字符串比较
|
比 较 |
描 述 |
|
str1 = str2 |
检查str1是否和str2相同,会将所有的标点和大小写情况都考虑在内 |
|
str1 != str2 |
检查str1是否和str2不同,会将所有的标点和大小写情况都考虑在内 |
|
str1 < str2 |
检查str1是否比str2小 |
|
str1 > str2 |
检查str1是否比str2大 |
|
-n str1 |
检查str1的长度是否非0 |
|
-z str1 |
检查str1的长度是否为0 |
关于字符串顺序 :
当要开始使用测试条件的大于或小于功能时,就会出现两个问题:
- 大于号和小于号必须转义,否则shell会把它们当作重定向符号,把字符串值当作文件名;
- 大于和小于顺序和sort命令所采用的不同。
4.3文件比较
|
比 较 |
描 述 |
|
-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旧 |
5复合条件测试
if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算符可用:
- [ condition1 ] && [ condition2 ] :要让then部分的命令执行,两个条件都必须满足。
- [ condition1 ] || [ condition2 ] :如果任意条件为TRUE,then部分的命令就会执行。
下例展示了AND布尔运算符的使用。
$ vim test22.sh
#!/bin/bash
if [ -d $HOME ] && [ -w $HOME/testing ]
then
echo "The file exists and you can write to it"
else
echo "I cannot write to the file"
fi 结果:
$ ./test22.sh
I cannot write to the file
$
$ touch $HOME/testing
$
$ ./test22.sh
The file exists and you can write to it
6 if-then的高级特性
6.1使用双括号
双括号命令允许你在比较过程中使用高级数学表达式,见下表:
|
符 号 |
描 述 |
|
val++ |
后增 |
|
val-- |
后减 |
|
++val |
先增 |
|
--val |
先减 |
|
! |
逻辑求反 |
|
~ |
位求反 |
|
** |
幂运算 |
|
<< |
左位移 |
|
>> |
右位移 |
|
& |
位布尔和 |
|
| |
位布尔或 |
|
&& |
逻辑和 |
|
|| |
逻辑或 |
6.2使用双方括号
双方括号命令提供了针对字符串比较的高级特性。双方括号命令的格式如下:
[[ expression ]]
它提供了test命令未提供的另一个特性——模式匹配(就是支持正则表达式)。
7case命令
格式:
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
Shell编程—结构化命令的更多相关文章
- Shell编程—结构化命令(2)
1for命令 for命令的基本格式: for var in list do commands done 在list参数中,你需要提供迭代中要用到的一系列值. 1.1读取列表中的值 例子: $ vim ...
- Linux编程 23 shell编程(结构化条件判断 命令if -then , if-then ... elif-then ...else,if test)
一.概述 在上一篇里讲到了shell脚本,shell按照命令在脚本中出现的顺序依次进行处理,对于顺序操作已经足够了,但许多程序要求对shell脚本中的命令加入一些逻辑流程控制,这样的命令通常叫做 结构 ...
- Linux编程 24 shell编程(结构化 if [ condition ] 数值比较,字符串比较)
一.概述 接着上篇讲的结构化命令,最后讲到了test命令的另一种写法 if [ condition ],它的语法格式如下: --格式如下: if [ condition ] then commands ...
- shell的结构化命令
shell在逻辑流程控制这里会根据设置的变量值的条件或其他命令的结果跳过一些命令或者循环执行的这些命令.这些命令通常称为结构化命令 1.if-then语句介绍 基本格式 if command then ...
- Linux&shell之结构化命令进阶
写在前面:案例.常用.归类.解释说明.(By Jim) for命令重复一系列的命令是一种常见的编程实践. #!/bin/bash # basic for command for test in A B ...
- Linux&shell之结构化命令
写在前面:案例.常用.归类.解释说明.(By Jim)使用if-then语句如果命令的退出状态是0(成功执行命令),将执行then后面的所有命令.如果命令的退出状态是0以外的其他值,那么then后面的 ...
- shell初级-----结构化命令
if-then语句 bash shell的if语句会执行if后面的那个命令,如果该命令的退出码状态为0会执行then部分的命令,如果是其他值不会执行. 格式如下: if command then co ...
- 《Linux命令行与shell脚本编程大全》第十二章 使用结构化命令
许多程序要就对shell脚本中的命令施加一些逻辑控制流程. 结构化命令允许你改变程序执行的顺序.不一定是依次进行的 12.1 使用if-then语句 如下格式: if command then ...
- Shell 语法之结构化命令(流程控制)
许多程序在脚本命令之间需要某种逻辑流控制,允许脚本根据变量值的条件或者其他命令的结果路过一些命令或者循环执行这些命令.这些命令通常被称为结构化命令.和其他高级程序设计语言一样,shell提供了用来控制 ...
随机推荐
- MAVEN无法下载com.oracle:jdbc14:jar解决办法
原文链接:https://www.cnblogs.com/gqzdev/p/11742999.html 第一步,下载ojdbc14jar包: 链接:ojdbc14jar 提取码: 2m59 第二步,下 ...
- 比较两个等长的字符串,若相同,则输出Match!,若不同,则输出No Match!
文章目录 问题 代码 运行结果 问题 比较两个等长的字符串,若相同,则输出Match!,若不同,则输出No Match! 代码 data segment str1 db 'ASDFGHJKL';字符串 ...
- Python os.fstat() 方法
概述 os.fstat() 方法用于返回文件描述符fd的状态,类似 stat().高佣联盟 www.cgewang.com Unix,Windows上可用. fstat 方法返回的结构: st_dev ...
- 牛客练习赛63 牛牛的斐波那契字符串 矩阵乘法 KMP
LINK:牛牛的斐波那契字符串 虽然sb的事实没有改变 但是 也不会改变. 赛时 看了E和F题 都不咋会写 所以弃疗了. 中午又看了一遍F 发现很水 差分了一下就过了. 这是下午和古队长讨论+看题解的 ...
- Java对象(创建过程、内存布局、访问方法)
(Java 普通对象.不包括数组.Class 对象等.) 对象创建过程 类加载 遇到 new 指令时,获取对应的符号引用,并检查该符号引用代表的类是否已被初始化.如果没有就进行类加载. 分配内存 ...
- 再见HTML ! 用纯Python就能写一个漂亮的网页
我们在写一个网站或者一个网页界面的时候,需要学习很多东西,对小白来说很困难!比如我要做一个简单的网页交互: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在 ...
- Springboot常用的注解
1.@Controller主要用来修饰类,用来处理http请求 2.@ResponseBody主要用来修饰类和方法.返回字符串和json数据,不用来返回模板. 3.@RestController主要用 ...
- C++ 的字符串反转
C++ 的字符串反转 方法一: 使用 algorithm 中的 reverse 函数: // reverse 函数的定义(在 std 名称空间中) template<class BidirIt& ...
- C# 使用代理实现线程间调用
实现功能: 后台线程改变窗体控件(flowLayoutPanel1)的状态. 利用 this.flowLayoutPanel1.InvokeRequired == false,可以知道是主线程调用的自 ...
- Python中对象实例的__dict__属性
实例的__dict__并不是一个方法,而是存储与该实例相关的实例属性的字典,对类中定义的方法(函数),方法名也是属性变量,类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__d ...