【读书笔记】Linux命令行与Shell脚本编程大全--使用结构化命令

结构化命令(structured command):命令会根据条件使脚本跳过某些命令。

1.使用if-then语句

if-then语句有如下格式:

if command
then 
 commands
fi

notice:

  1. bash shell的if语句会运行if后面的那个命令,then是否执行依据if后面的命令执行的退出状态码。(和C/java等语言if语句后面判断依据不同)
  2. then 部分可以跟多条命令语句,执行依据依然是if后面的命令执行的退出状态码。
  3. if-then语句只能测试命令退出状态码的条件(后续的test命令可以测试命令状态码之外的条件)。

eg:

if ls
then
	echo "ls run ok."
	echo "ls run ok1."
fi

2.使用if-then-else语句

Q:if-then-else语句的作用?
A:在if-then语句中,不管命令是否成功执行,你都只有一种选择。如果命令返回一个非零退
出状态码,bash shell会继续执行脚本中的下一条命令。

if-then-else语句格式如下:

if command
then 
 commands
else 
 commands
fi

eg:

if lsa
then
	echo "lsa run ok."
else
	echo "lsa run error."   -> 这里
fi

3.嵌套if (elif)

Q:嵌套if的使用场景?
A:需要检查脚本代码中的多种条件

嵌套if的格式如下(常见多种,具实选用):

if command1
then
	commands
else
	commands
	if command2
	then
		commands
	fi
fi
if command1
then 
 	commands
elif command2
then 
	commands
fi
if command1
then 
 	commands
elif command2
then 
	commands
else
fi

举例一种:

if lsa
then
        echo "lsa error"
elif pwda
then
        echo "pwda error"
else
        echo "all error,over."		-> 这里
fi

notcie:记住,在elif语句中,紧跟其后的else语句属于elif代码块。它们并不属于之前的if-then代码块。

4.test命令–test condition

test命令格式如下:

test condition

condition是test命令要测试的一系列参数和值

notice:
bash shell提供了另一种条件测试方法,无需在if-then语句中声明test命令
其格式如下(即[ condition ] == test condition):

if [ condition ] 
then 
 commands
fi

eg:

isfull="Full"
if test $isfull  #此处可换为 if [ $isfull ]
then
        echo "isfull is Full."			->  这里
else
        echo "isfull is not Full."
fi
isfull=""
if test $isfull	#此处可换为 if [ $isfull ]
then
        echo "isfull is Full."
else
        echo "isfull is not Full."		->	这里
fi

test命令可以判断三类条件:1:数值比较;2:字符串比较;3:文本比较。 其中有些特别的点需要小心谨慎的。

4.1 数值比较

数值条件测试可以用在数字和变量上。
在这里插入图片描述
eg:

var1=4
var2=6
if [ $var1 -eq $var2 ]
then
        echo "var1==var2."
else
        echo "var1!=var2."		->这里
fi

notice:bash shell只能处理整数,也就是不能在test命令中使用浮点值。

4.2 字符串比较

在这里插入图片描述

notice:

  1. 在比较字符串的相等性时,比较测试会将所有的标点和大小写情况都考虑在内。
  2. 大于号和小于号必须转义,否则shell会把它们当作重定向符号,把字符串值当作文件名。
    eg:if [ $val1 \> $val2 ]
  3. 大于和小于顺序和sort命令所采用的不同。当你将同样的字符串放进文件中并用sort命令排序时,小写字母会先出现。这是由各个命令使用的排序技术不同造成的。比较测试中使用的是标准的ASCII顺序,根据每个字符的ASCII数值来决定排序结果。sort命令使用的是系统的本地化语言设置中定义的排序顺序。
  4. test命令和测试表达式使用标准的数学比较符号来表示字符串比较,而用文本代码来表示数值比较

eg:

a=aa
b=bb
if [ $a > $b ]
then
        echo " aa > bb"			->	这里
else
        echo " aa < bb"
fi
if [ $a /> $b ]
then
        echo " aa > bb"
else
        echo " aa < bb"			->	这里
fi

-n和-z可以检查一个变量是否含有数据。即是否为空

这里书中没有明显的体现出来,笔者这里将-n和-z作下对比:

参数 描述
n 不为空则 if 退出状态码为0
z 为空则 if 退出状态码为0

notice:空的和未初始化的变量会对shell脚本测试造成灾难性的影响。如果不是很确定一个变量的内容,最好在将其用于数值或字符串比较之前先通过-n或-z来测试一下变量是否含有值。

eg:

v1="have"							#v1 实际不为空
if [ -n $v1 ]
then
        echo "v1 is not null."		#->	这里
else
        echo "v1 is null."
fi

if [ -z $v1 ]
then
        echo "v1 is null."
else
        echo "v1 is not null."		#->	这里
fi

4.3 文本比较

test命令的文本比较允许测试Linux文件系统上文件和目录的状态。
在这里插入图片描述
具体细节可参考该书12.4.3章节,分别对每个参数都做了详细的说明演示。

5.复合条件测试–&& ||

if-then语句允许使用布尔逻辑来组合测试。有两种布尔运算符可用,其格式如下:

[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]

eg:

var1=aa
var2=bb
var3=cc
if [ $var3 \> $var1  ] && [ $var1 \< $var2 ]
then
        echo " cc > aa && aa << bb"				#这里
else
        echo " && is not ok"
fi
~   

6.if-then的高级特性–双括号和双方括号

6.1 用于数学表达式的双括号

双括号命令允许在比较过程中使用**高级数学表达式。**而test命令只能在比较中使用简单的算术操作。
其命令格式如下:

(( expression ))

expression 可以是任意的数学赋值或比较表达式。除了test命令使用的标准数学运算符,还有如下:
在这里插入图片描述
ps:双括号命令提供的另一个高级特性:不需要将双括号中表达式里的大于号转义。
eg:

var1=aa
var2=bb
var3=cc
if ( ! ([ $var3 \> $var1  ] && [ $var1 \< $var2 ]) )
then
        echo " ! is not ok"
else
        echo " ! is ok"		# 这里
fi

6.2 用于高级字符串处理功能的双方括号

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

[[ expression ]]

双括号命令里的expression除了使用了test命令中的标准字符串比较外,还提供了另一个特性:模式匹配(pattern matching)。

ps:双方括号在bash shell中表现良好。但不是所有的shell都支持双方括号。

eg:

if [[ $USER == h* ]]			#这里不比某些语言,不能写成 if [[ h* == $USER]]	这样
then
        echo "Hello $USER."
else
        echo "I do not Know you."	#这里
fi

7.case命令–避开大量的if-then-else语句

Q:什么时候需要使用case命令?
A:在有大量的if-then-else语句的情况下,可以考虑使用case命令。

case命令会采用列表格式来检查单个变量的多个值。
case命令格式如下:

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

eg:

case $USER in
root | nobody)  echo "Hello, $USER root?";;
hogoadr)        echo "Hello, $USER";;		#这里
*)      echo "Who are you?";;
esac

申明:文中没特殊注明,图皆来自Linux命令行与shell脚本编程大全<第三版>。

发布了91 篇原创文章 · 获赞 17 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_23327993/article/details/104616026