linux shell 脚本-基础知识(二)

条件测试和判断语句

在shell 中,用户可以使用测试语句来测试指定的条件表达式的条件的真或者假。当指定的条件为真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0值。

条件测试的语法有两种,分别是test和[命令,下面分别来讲解它们的语法:
1)test
test 语法如下:

test expression

参数expression表示需要测试的条件表达式,可以由字符串、整数、文件名,以及各种运算符组成。

2)[
test 命令相同,[ 命令的作用也是对后面的条件表达式进行测试,但是为了增加程序的可读性,shell要求在表达式后面追加一个右方括号 ] 来与前面的 [ 命令配对。语法如下:

[ expression ]

[是命令,expression 是条件表达式。条件表达式和左右方括号之间都必须有一个空格。

左方括号 [ 是一个shell命令,而非条件表达式的一部分。
而命令与参数之间必须保留一个空格。
所以,在上面的语法中,expression与左右括号都需保留一个空格。

字符串测试

shell中,可以通过5种运算符来对字符串进行操作。

字符串运算符

运算符 说明
string 判断指定的字符串是否为空
string1 = string2 判断两个字符串是否相等
string1 != string2 判断两个字符串是否不相等
-n string 判断字符串是否非空串
-z string 判断字符串是够为空串

对于字符串测试应该基本了解,但应注意以下两点:

  • 在给变量赋值的时候,等号"="左右两边一定不要有空格;否则,shell会把空格前面的字符串当作shell命令
  • 在测试运算符"="、"!="、及"-z"等符号的左右两边,一定含有空格

整数测试

整数测试的语法形式为:

[ number1 op number2 ]
运算符 说明
number1 -eq number2 比较number1 和number2是否相等。如果相等,测试结果为0
number1 -ne number2 比较number1 和number2是否不相等。如果不相等,测试结果为0
number1 -gt number2 比较number1是否大于number2。如果大于,测试结果为0
number1 -lt number2 比较number1是否小于number2。如果小于,测试结果为0
number1 -ge number2 比较number1 是否大于等于number2。如果大于等于,测试结果为0
number1 -le number2 比较number1是否小于等于number2。如果小于等于,测试结果为0

字符串运算符和整数运算符不可以混用。

[root@VM_16_3_centos base]$ x=12.3 
[root@VM_16_3_centos base]$ y=12 
[root@VM_16_3_centos base]$ [ "$x" -gt "$y" ]
-bash: [: 12.3: integer expression expected

文件测试

[ op file ]
操 作 符 说明
-a file 文件是否存在。如果file存在,则结果为0
-b file 文件是否存在,且为块文件。如果file是一个已经存在的块文件,则结果为0
-c file 文件是否存在,且为字符文件。如果file是一个已经存在的字符文件,则结果为0
-d file 文件是否存在,且为目录。如果file是一个已经存在的目录,则结果为0
-e file 同-a操作符
-s file 文件的长度是否大于0或者文件为非空文件。如果file是一个非空文件,则结果为0
-f file 文件存在,且为常规文件。如果file是一个已经存在的常规文件,则结果为0
-w file 文件是否存在且可写。如果文件按是一个可写文件则结果为0
−L file 文件是否存在,且为符号链接。如果file是一个已经存在的符号链接,则结果为0
−u file 文件是否设置suid位。如果file已经设置了suid位,则结果为0
−r file 文件是否存在且可读。如果文件按是一个可读文件则结果为0
−x file 文件是否存在且可执行。如果文件按是一个可执行文件则结果为0

逻辑操作符

操作符 说明
!expression 逻辑非,条件表达式expression的值为假,则该操作符的运算结果为真
expression1 -a expression2 逻辑与,条件表达式expression1和expression2的值都是真时,整个表达式的值才为真
expression1 −o expression2 逻辑或,条件表达式 expression1或者expression2的值有一个为真时,整个表达式的值就为真

条件判断语句

1.使用简单的if语句进行判断

if expression
then
    statement
    statement
fi

例4:通过条件测试判断某些文件的类型

#!/bin/bash

# 通过条件测试判断/bin/bash 文件是否存在
if [ -a /bin/bash ]
then
    echo "/bin/bash exist!"
fi

结果为

[root@VM_16_3_centos if_test]$ sh if.sh 
/bin/bash exist!

例5:使用空命令作为判断条件

#! /bin/bash

if :; 
then
    echo "always true"; 
fi

空命令":"的退出状态永远为0,因此会输出 always true。

例6:使用&&代替 if 语句进行判断

#! /bi/bash

test "$whoami" != "root" && (echo you are using a non-privileged account; exit 1)

该判断语句首先对当前用户进行判断,如果当前用户不为root,也即为真则输出后面的说明语句。

2.使用if else 语句进行流程控制

if expression 
then 
    statement1
    statement2
    ..
else 
    statement3
    statement4
    ..
fi

3.使用if elif进行多条件判断

if expression
then 
    statement1
    statement2
    ..
elif expression
then
    statement3
    statement4
    ..
else
    statement5
    ..
fi

4.使用exit语句退出程序

exit status

status参数表示退出状态,该参数是一个整数值,其取值范围为0~255;

按照惯例,退出状态0意味着脚本成功运行完毕;而非0通常意味着程序执行过程中出现某些错误。
因此,用户可以用其它的非0值来给父进程传递不同的消息,根据子进程的成功或者失败,父进程采取不同的措施,如果没有参数给语句,那么由exit语句之前的那条语句的执行状态来决定。

5.多条件判断语句case

case语句基本语法:

case variable in
value1)
    statement1
    statement2
    ..
    statementn;;
value2)
    statement1
    statement2
    ..
    statementn;;
...
valuen)
    statement1
    statement2
    ..
    statementn;;
#其它情况
*)
    statement1
    statement2
    ..
    statementn;;
#相当于if 结尾fi
esac

6.利用case语句处理用户输入

例7:说明case语句的使用方法

#! /bin/bash

echo "Hit a key, then hit return."
#读取用户按下的键
read keypress
#case语句开始
case "$keypress" in
    #小写字母
    [[:lower:]])
        echo "Lowercase letter.";;
    [[:upper:]])
        echo "Uppercase letter.";;
    [0-9])
        echo "Digit.";;
    *)
        echo "other letter.";;
esac

7.运算符

1.使用expr外部程序
#!/bin/bash

#注意: 要用反引号括起来
result=`expr 2 - 100`
echo "result=${result}"
result=`expr 2-100`
echo "result=${result}"

result=`expr \( 2 - 6 \) \* 12`
echo "result=${result}"

result=`expr (2-6)*12`
echo "result=${result}"

结果为

[root@VM_16_3_centos if_test]$ sh expr.sh 
result=-98
result=2-100
result=-48
expr.sh: command substitution: line 12: syntax error near unexpected token `2-6'
expr.sh: command substitution: line 12: `expr (2-6)*12'
result=

使用expr命令时要注意运算符左右两边的空格,同时需要将括号进行转义表示,括号两边也要注意空格

2.使用$((…))

例10:演示使用$((…))符号进行算术运算

#!/bin/bash

result=$(( 3+6 ))
echo "result= $result"

result=$(( (1-4) * 5 ))
echo "result= $result"
result= 9
result= -15
3.使用let命令

例11:演示使用let命令执行算术运算

#! /bin/bash

n=10
let n=n+1
echo "$n"
let n=n*10
echo "$n"
let n=n**2
echo "$n"
11
110
12100
4.使用位运算符

例12:演示使用位运算符的方法

#! /bin/bash

result=$[ 2 << 3 ]
echo "$result"
result=$[ 8>> 2 ]
echo "$result"
result=$[ 8 & 4 ]
echo "$result"
result=$[ ~8 ]
echo "$result"
result=$[ 10 ^ 6 ]
echo "$result"

结果为:

16
2
0
-9
12
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,618评论 0 10
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,310评论 0 5
  • 字符串运算符 运算符 说明 string 判断指定的字符串是否为空 string1 = string 2...
    Al_不期而遇阅读 148评论 0 0
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,867评论 0 9
  • 黄昏里 彩霞灿烂了天边 阳光斜照着 射出云层 似皮筋 拉得长长的 紧紧的 绑在树上 拉着走 树站在原地 留下长长的...
    杖剑走四方阅读 144评论 0 8