Linux与unixshell编程指南
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux与unixshell编程指南
14
1、使⽤变量时,尽量⽤花括号将之括起来,防⽌shell误解变量值。
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
<>Did You See The Full Moon
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 $?
~/tools$ test -w a.vim
~/tools$ echo $?
~/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 $?
~/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 $?
~/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 $?
可以使⽤逻辑操作符将两个测试表达式结合起来,只能在⼀对⽅括号中使⽤,如:
:~/tools$ [ "990" -le "995" -a "123" -gt "33" ]
:~/tools$ echo $?
:~/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。