快速了解和学习Unix/Linux下Shell(二)

Tags: linux shell bash

这篇文章是快速了解和学习Unix/Linux下Shell的第二部分,前一部分参考快速了解和学习Unix/Linux下Shell(一)

一、Shell转义及变量替换

1. 转义字符、变量、命令替换

如果表达式中包含转义字符,Shell会把转义字符替换成对应的含义。如果表达式中包含被双引号括住的变量,Shell使用变量值替换变量名,如:

#!/bin/bash

a=10
echo -e "Value of a is $a \n"

注意:echo的选项-e代表对转义字符进行替换,-E代表不替换转义字符(默认情况),-n代表禁止替换换行符,以上命令会得到下面结果,

Value of a is 10

如果不使用-e选项则得到:

Value of a is 10\n

下表是在shell中可以使用的转义字符及含义

转义字符含义
\\            
反斜杠
\a警报,响铃
\b退格(删除键)
\f换页(FF),将当前位置移到下页开头
\n换行
\r回车
\t水平制表符(tab键) 
\v垂直制表符

2. 命令返回值替换

命令返回值替换是指Shell将命令执行的结果保存在变量中,然后在适当的地方输出,语法是:

`command`

注意上面的引号不是[']而是[`](即TAB上方ESC下方那个键)。下面是命令替换的几个例子。

#!/bin/bash

DATE=`date`
echo "Date is $DATE"

USERS=`who | wc -l`
echo "Logged in user are $USERS"

UP=`date ; uptime`
echo "Uptime is $UP"

运行结果为:

Date is Thu Jul  2 03:59:57 MST 2009
Logged in user are 1
Uptime is Thu Jul  2 03:59:57 MST 2009
03:59:57 up 20 days, 14:03,  1 user,  load avg: 0.13, 0.07, 0.15

3. 变量状态替换

变量状态替换可以根据变量的状态(是否为空、是否定义等)来改变它的值,请参考下表:

形式说明
${var}变量本来的值
${var:-word}如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值
${var:=word}如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word
${var:?message}如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。
若此替换出现在Shell脚本中,那么脚本将停止运行
${var:+word}如果变量 var 被定义,那么返回 word,但不改变 var 的值

变量状态替换参考示例以及运行结果

#!/bin/bash

echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"

echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"

unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"

var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"

echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"
Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set

3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix

二、Shell运算符:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等

Bash 支持很多运算类型:算数运算、关系运算、布尔运算、字符串运算和文件测试运算。原生bash不支持简单的数学运算,但是可以通过系统命令实现,常用的如:awk、expr等.其中expr 最常用,expr是linux系统中常用的表达式计算工具可以完成表达式求值操作。

#!/bin/bash

#表达式相加
val=`expr 2 + 2`
#结果为 4
echo "Total value : $val"

注意:

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。

  • 表达式要使用` `括住,注意这个字符不是单引号,而是TAB上方 Esc 下方的`。

1. 算术运算

下面的示例是使用expr实现算数运算的示例,需要注意:

  • 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;

  • if...then...fi 是条件语句。

#!/bin/sh

a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
echo "a is equal to b"
fi

if [ $a != $b ]
then
echo "a is not equal to b"
fi

运行结果:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a is not equal to b

算数运算符列表:

运算符说明举例
 +加法`expr $a + $b` 结果为 30
 -减法`expr $a - $b` 结果为 10
 *乘法`expr $a \* $b` 结果为  200
/除法`expr $b / $a` 结果为 2
%取余`expr $b % $a` 结果为 0
=赋值a=$b 将把变量 b 的值赋给 a
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false
 !=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true

注意:条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]。

2. 关系运算

关系运算符只支持数字或者字符串形式的数字,不支持包含非数字的字符串,如:

#!/bin/sh

a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a is equal to b"
else
echo "$a -eq $b: a is not equal to b"
fi

if [ $a -ne $b ]
then
echo "$a -ne $b: a is not equal to b"
else
echo "$a -ne $b : a is equal to b"
fi

if [ $a -gt $b ]
then
echo "$a -gt $b: a is greater than b"
else
echo "$a -gt $b: a is not greater than b"
fi

if [ $a -lt $b ]
then
echo "$a -lt $b: a is less than b"
else
echo "$a -lt $b: a is not less than b"
fi

if [ $a -ge $b ]
then
echo "$a -ge $b: a is greater or  equal to b"
else
echo "$a -ge $b: a is not greater or equal to b"
fi

if [ $a -le $b ]
then
echo "$a -le $b: a is less or  equal to b"
else
echo "$a -le $b: a is not less or equal to b"
fi

结果:

10 -eq 20: a is not equal to b
10 -ne 20: a is not equal to b
10 -gt 20: a is not greater than b
10 -lt 20: a is less than b
10 -ge 20: a is not greater or equal to b
10 -le 20: a is less or  equal to b

关系运算符列表:

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 true
 -ne检测两个数是否相等,不相等返回 true。[ $a -ne $b ] 返回 true
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false
 -lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true
 -ge检测左边的数是否大等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false
 -le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true

3. 布尔运算

示例:

#!/bin/sh

a=10
b=20

if [ $a != $b ]
then
echo "$a != $b : a is not equal to b"
else
echo "$a != $b: a is equal to b"
fi

if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a -lt 100 -a $b -gt 15 : returns true"
else
echo "$a -lt 100 -a $b -gt 15 : returns false"
fi

if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : returns true"
else
echo "$a -lt 100 -o $b -gt 100 : returns false"
fi

if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : returns true"
else
echo "$a -lt 100 -o $b -gt 100 : returns false"
fi

结果:

10 != 20 : a is not equal to b
10 -lt 100 -a 20 -gt 15 : returns true
10 -lt 100 -o 20 -gt 100 : returns true
10 -lt 5 -o 20 -gt 100 : returns false

布尔运算符列表:

运算符说明举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true
-a与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false

4.字符串运算

示例:

#!/bin/sh

a="abc"
b="efg"

if [ $a = $b ]
then
echo "$a = $b : a is equal to b"
else
echo "$a = $b: a is not equal to b"
fi

if [ $a != $b ]
then
echo "$a != $b : a is not equal to b"
else
echo "$a != $b: a is equal to b"
fi

if [ -z $a ]
then
echo "-z $a : string length is zero"
else
echo "-z $a : string length is not zero"
fi

if [ -n $a ]
then
echo "-n $a : string length is not zero"
else
echo "-n $a : string length is zero"
fi

if [ $a ]
then
echo "$a : string is not empty"
else
echo "$a : string is empty"
fi

结果:

abc = efg: a is not equal to b
abc != efg : a is not equal to b
-z abc : string length is not zero
-n abc : string length is not zero
abc : string is not empty

字符串运算符列表:

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false
!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false
-n检测字符串长度是否为0,不为0返回 true。[ -z $a ] 返回 true
str检测字符串是否为空,不为空返回 true。[ $a ] 返回 true


5、文件测试运算符

可以通过文件测试运算符来依据文件的各种属性检测Unix/Linux文件。
例如,变量 file 表示文件“/var/www/tutorialspoint/unix/test.sh”,它的大小为100字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:

#!/bin/sh

file="/var/www/tutorialspoint/unix/test.sh"

if [ -r $file ]
then
echo "File has read access"
else
echo "File does not have read access"
fi

if [ -w $file ]
then
echo "File has write permission"
else
echo "File does not have write permission"
fi

if [ -x $file ]
then
echo "File has execute permission"
else
echo "File does not have execute permission"
fi

if [ -f $file ]
then
echo "File is an ordinary file"
else
echo "This is sepcial file"
fi

if [ -d $file ]
then
echo "File is a directory"
else
echo "This is not a directory"
fi

if [ -s $file ]
then
echo "File size is zero"
else
echo "File size is not zero"
fi

if [ -e $file ]
then
echo "File exists"
else
echo "File does not exist"
fi

结果:

File has read access
File has write permission
File has execute permission
File is an ordinary file
This is not a directory
File size is zero
File exists

文件测试运算符列表

操作符说明举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -b $file ] 返回 false
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false
-p file检测文件是否是具名管道,如果是,则返回 true。[ -p $file ] 返回 false
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true

本文链接:http://www.4byte.cn/learning/119986/kuai-su-liao-jie-he-xue-xi-unix-linux-xia-shell-er.html