Linux与unix shell编程指南

mac2022-06-30  61

第14章 环境和shell变量

1、使用变量时,尽量用花括号将之括起来,防止shell误解变量值。

 

2、设置变量时的不同模式

variable-name=value设置实际值到variable-namevariable-name+value如果设置了variable-name,则重设其值variable-name:?value如果未设置variable-name,显示未定义用户错误信息variable-name?value如果未设置variable-name,显示系统错误信息variable-name:=value如果未设置variable-name,设置其值variable-name:-value同上,但是取值并不设置到variable-name,可以被替换

 

3、使用unset命令清除设置,如:

~$ PC=enterprise ~$ echo ${PC} enterprise ~$ unset PC ~$ echo ${PC}

 

4、使用set命令显示所有本地shell变量。

 

5、将变量并排可以使变量结合在一起:

echo ${variable-name}${variable-name}...

如:

~$ FIRST="Bruce " ~$ SURNAME="Willis" ~$ echo ${FIRST}${SURNAME} Bruce Willis

 

6、有时要测试是否已经设置或初始化变量。如果未设置或初始化,就可以使用另一个值。此命令格式为:

${variable:-value}

如:

~$ COLOR="blue" ~$ echo "The sky is ${COLOR:-gray} today" The sky is blue today ~$ ~$ unset COLOR ~$ echo "The sky is ${COLOR:-gray} today" The sky is gray today

 

上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:

${variable:=value}

如:

~$ echo ${COLOR} ~$ echo "The sky is ${COLOR:=gray} today" The sky is gray today ~$ echo ${COLOR} gray

 

7、测试变量是否取值,然后返回带有系统错误信息的结果,如下面例子测试变量file是否取值:

~$ echo "The file is ${FILE:?}" -bash: FILE: 参数为空或未设置

 

以上结果可读性不好,但是可以加入自己的脚本以增加可读性。如:

~$ echo "The file is ${FILE:?" sorry cannot locate the variable files"}" -bash: FILE: sorry cannot locate the variable files

 

8、设置只读变量,格式如下:

variable-name=value readonly variable-name

如:

~$ TYPE_DEV="/dev/rmt/0n" ~$ echo ${TYPE_DEV} /dev/rmt/0n ~$ readonly TYPE_DEV ~$ TYPE_DEV="/dev/rmt/1n" -bash: TYPE_DEV: 只读变量

要查看所有只读变量,使用命令readonly即可。

 

9、环境变量

环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。shell中执行的用户进程均称为子进程。不像本地变量(只用于现在的shell)环境变量可用于所有子进程,包括编辑器、脚本和应用。

所有环境变量均为大写,环境变量应用于用户和进程前,必须用export命令导出。格式如下:

VARIABLE_NAME=value;export VARIABLE_NAME

VARIABLE_NAME=value export VARIABLE_NAME

使用env命令可以查看所有的环境变量。

 

10、位置变量参数

如果要向一个shell脚本传递信息,可以使用位置参数完成此功能,。参数相关数目传入脚本,此数目可以任意多,单只有前9个可以被访问,使用shift命令可以改变这个限制。

如果向脚本传递Did You See The Full Moon信息,下面的表格讲解了如何访问每一个参数:

$0$1$2$3$4$5$6$7$8$9<>DidYouSeeTheFullMoon

 

11、特定变量参数

$#传递到脚本的参数个数$*以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个$$脚本运行的当前进程ID$!后台运行的最后一个进程的进程ID号$@与$#相同,但是使用时加引号,并在引号中返回每个参数$-显示shell使用的当前选项,与set命令功能相同$?显示最后命令的退出状态,0表示没有错误,其他任何值表明有错误

 

第15章 引号

1、反引号

反引号用于设置系统命令的输出到变量。

下面的例子中,如:

~$ echo `date` 2014年 04月 11日 星期五 16:03:13 CST

 

2、反斜线

如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。下述字符包含有特殊意义:&*+^$`"|?。如:

~$ echo $$ 1830 ~$ echo \$$ $$

 

第17章 条件测试

对文件、字符串和数字使用test命令;

对数字和字符串使用expr命令。

expr命令和执行数值输出。使用最后退出状态命令$?可测知test和expr,二者均以0表示正确,1表示返回错误。

 

1、测试文件状态

test一般有两种格式,即:

test condition

[condition]

使用方括号时,要注意在条件两边加上空格。

常用条件表达式:

-d目录-f正规文件-L符号链接-r可读-s文件长度大于0、非空-w可写-u文件有suid位设置-x可执行

如:

~/tools$ ls -l a.vim -rw------- 1 xxx xxx 31424 11月 3 09:17 a.vim ~/tools$ [ -w a.vim ] ~/tools$ echo $? 0 ~/tools$ test -w a.vim ~/tools$ echo $? 0 ~/tools$ [ -x a.vim ] ~/tools$ echo $? 1

 

2、测试时使用逻辑操作符

有时比较两个文件状态,shell提供三个逻辑操作完成此功能:

-a逻辑与-o逻辑或!逻辑否

如:

~/tools$ ls -l a.vim grep.vim -rw------- 1 xxx xxx 31424 11月 3 09:17 a.vim -rw------- 1 xxx xxx 32997 11月 3 10:42 grep.vim ~/tools$ [ -w a.vim -a -w grep.vim ] ~/tools$ echo $? 0 ~/tools$ [ -w a.vim -a -x grep.vim ] ~/tools$ echo $? 1

 

3、字符串测试

有5种格式:

test "string"

test string_operator "string"

test "string" string_operator "string"

[ string_operator string ]

[ string string_operator string ]

string_operator可为

=两个字符串相等!=两个字符串不等-z空串-n非空串

如:

~/tools$ [ -z $VARIABLE_NAME ] ~/tools$ echo $? 0 ~/tools$ VARIABLE_NAME="name" ~/tools$ [ -z $VARIABLE_NAME ] ~/tools$ echo $? 1

 

4、测试数值

一般格式如下:

"number" numeric_operator "number"

[ "number" numeric_operator "number" ]

numberic_operator可为:

-eq相等-ne不相等-gt第一个数大于第二个数-lt第一个数小于第二个数-ge第一个数大于或等于第二个数-le第一个数小于或等于第二个数

如:

:~/tools$ NUMBER=130 :~/tools$ [ "$NUMBER" -eq "130" ] :~/tools$ echo $? 0

可以使用逻辑操作符将两个测试表达式结合起来,只能在一对方括号中使用,如:

:~/tools$ [ "990" -le "995" -a "123" -gt "33" ] :~/tools$ echo $? 0 :~/tools$ [ "990" -le "995" -a "123" -gt "133" ] :~/tools$ echo $? 1

 

5、expr用法

一般用于整数值,但也可用于字符串,一般格式如下:

expr argument operator argument

如:

:~/tools$ expr 10 + 10 20

使用乘号时,必须用反斜线屏蔽其特定含义,如:

:~/tools$ expr 30 * 30 expr: 语法错误 :~/tools$ expr 30 \* 30 900

 

expr在循环中用于增量计算,如:

:~/tools$ LOOP=0 :~/tools$ `expr $LOOP + 1`

 

expr也有模式匹配功能,可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任意字符串重复0次或多次,如:

:~/tools$ VALUE=account.doc :~/tools$ expr $VALUE : '.*' 11

 

在expr中可以使用字符串匹配操作,这里使用模式.doc抽取文件附属名:

:~/tools$ expr $VALUE : '\(.*\).doc' account

转载于:https://www.cnblogs.com/sheshiji/p/3658242.html

相关资源:Linux与Unix shell编程指南(完整高清版)
最新回复(0)