变量修饰符扩展
${variable:-word}
如果变量variable已被设置且非空,则代入它的值。否则,代入word
${variable:=word}
已被设置且值非空,就代入它的值。否则,将variable的值设为word。始终代入variable的值。位置参量不能用这种方式赋值
${variable:+word}
如果变量variable已被设置且值非空,代入word。否则,什么都不代入(代入空值)
${variable:?word}
如果变量variable已被设置且值非空,就代入它的值。否则,输出word并且从shell退出。如果省略了word,就会显示信息:parameter null or not set
${variable:offset}
获得变量variable值中位置从offset开始的子串,偏移为从0到串的末尾 19
${variable:offset:length}
获得变量variable值中位置从offset开始长度为length的子串
和冒号配合使用时,修饰符(-、=、+、?)检查变量是否尚未赋值或值为空。不加冒号时,值为空的变量也被认为已设置。
范例13-60
(临时替换默认值)
1 $ fruit=peach
2 $ echo ${fruit:–plum}
peach
3 $ echo ${newfruit:–apple}
apple
4 $ echo $newfruit
5 $ echo $EDITOR # More realistic example
6 $ echo ${EDITOR:-/bin/vi}
/bin/vi
7 $ echo $EDITOR
8 $ name=
$ echo ${name-Joe}
9 $ echo ${name:-Joe}
Joe
说明
1. 将变量fruit的值设为peach。
2. 这个专用修饰符将检查变量fruit是否已被设置。如果fruit已被设置,就显示它。否则,用plum替换fruit,并显示该值。
3. 变量newfruit未曾被设置。值apple将暂时替换newfruit。
4. 上一行的设置是暂时的,因此,变量newfruit仍未被设置。
5. 环境变量EDITOR尚未被设置。
6. 修饰符:-将/bin/vi替换为EDITOR。
7. EDITOR未曾被设置过,因此什么都不会打印。
8. 变量name被设为空值。因为修饰符前面没有冒号,变量即使为空也被认为是设置过的,所以没有把新的值Joe赋给变量name。
9. 冒号使得修饰符检查变量是否未设置或为空。只要是这两种情况之一,就用值Joe替换name。
范例
(永久替换默认值)
1 $ name=
2 $ echo ${name:=Peter}
Peter
3 $ echo $name
Peter
4 $ echo ${EDITOR:=/bin/vi}
/bin/vi
5 $ echo $EDITOR
/bin/vi
说明
1. 赋给变量name一个空值。
2. 用修饰符:=将检查变量name是否尚未被设置。如果已经被设置过了,就不会被改变。如果尚未设置或值为空,就将等号右边的值赋给它。由于之前已将变量name设置为空,所以现在要把Peter赋给它。这个设置是持久的。
3. 变量name的值还是Peter。
4. 把变量EDITOR设置为/bin/vi。
5. 显示变量EDITOR的值。
范例
(临时替换值)
1 $ foo=grapes
2 $ echo ${foo:+pears}
pears
3 $ echo $foo
grapes
$
说明
1. 将变量foo的值设置为grapes。
2. 专用修饰符:=将检查变量name是否已被设置。如果已经被设置过,就用pears暂时替换foo。否则,返回空。
3. 变量foo的值还是原来的值。
范例
(基于默认值创建错误信息)
1 $ echo ${namex:?"namex is undefined"}
namex: namex is undefined
2 $ echo ${y?}
y: parameter null or not set
说明
1. 修饰赋:?检查变量是否已被设置。如果尚未设置该变量,就把问号右边的信息打印在标准错误输出上。如果此时是在执行脚本,就退出脚本。
2. 如果问号后面没有提供报错信息,shell就向标准错误输出发送默认的消息。
范例
(创建子串 20)
1 $ var=notebook
2 $ echo ${var:0:4}
note
3 $ echo ${var:4:4}
book
4 $ echo ${var:0:2}
no
说明
1. 给变量赋值notebook。
2. var的子串从偏移0(notebook中的n)开始,长度为4个字符,在e处结束。
3. var的子串从偏移4(notebook中的b)开始,长度为4个字符,在k处结束。
4. var的子串从偏移0(notebook中的n)开始,长度为2个字符,在o处结束。
子串的变量扩展
模式匹配变量用来在串首或串尾截掉串的某一特定部分。这些操作符最常见的用法是从路径头或尾删除路径名元素。如表13-19所示。
表 变量扩展子串
表 达 式
功 能
${变量%模式}
将变量值的尾部与模式进行最小匹配,并将匹配到的部分删除
${变量%%模式}
将变量值的尾部与模式进行最大匹配,并将匹配到的部分删除
${变量#模式}
将变量值的头部与模式进行最小匹配,并将匹配到的部分删除
${变量##模式}
将变量值的头部与模式进行最大匹配,并将匹配到的部分删除
${#变量}
替换为变量中的字符个数。如果是*或@,长度则是位置参量的个数
范例
1 $ pathname="/usr/bin/local/bin"
2 $ echo ${pathname%/bin*}
/usr/bin/local
说明
1. 给局部变量pathname赋值/usr/bin/local/bin。
2. %删除路径名尾部包含模式/bin,后跟零个或多个字符的最小部分。即删除/bin。
范例
1 $ pathname="usr/bin/local/bin"
2 $ echo ${pathname%%/bin*}
/usr
说明
1. 给局部变量pathname赋值/usr/bin/local/bin。
2. %%删除路径名尾部包含模式/bin,后跟零个或多个字符的最大部分。即删除/bin/local/bin。
范例
1 $ pathname=/home/lilliput/jake/.bashrc
2 $ echo ${pathname#/home}
/lilliput/jake/.bashrc
说明
1. 给局部变量pathname赋值/home/liliput/jake/.bashrc。
2. #删除路径名头部包含模式/home的最小部分。路径变量开头的/home被删除。
范例
1 $ pathname=/home/lilliput/jake/.bashrc
2 $ echo ${pathname##*/}
.bashrc
说明
1. 给局部变量pathname赋值/home/liliput/jake/.bashrc。
2. ##删除路径名的头部包含零个或多个字符,直到并包括最后一个斜杠的最大部分。即从路径变量中删除/home/liliput/jake/。
范例
1 $ name="Ebenezer Scrooge"
2 $ echo ${#name}
16
说明
1. 给变量name赋值Ebenezer Scrooge。
2. ${#variable}语法显示赋给变量name的字符串中字符的个数。字符串Ebenezer Scrooge中有16个字符。
位置参量
这组专用内置变量常常被称为位置参量,通常被shell脚本用来从命令行接收参数,或者被函数用来保存传给它的参数。这组变量之所以被称为位置参量,是因为引用它们要用到1、2、3等数字,这些数字分别代表它们在参数列表中的相应位置。请参见表13-20。
$#
其值为位置参量的个数
$*
其值为所有的位置参量
$@
除了被双引号引用的情况,含义与$*相同
"$*"
其值为"$1 $2 $3"
"$@"
其值为"$1" "$2" "$3"
shell脚本名存在变量$0中。位置参量可以用set命令来设置,重置和复位。
1 $ set punky tommy bert jody
$ echo $* # Prints all the positional parameters
punky tommy bert jody
2 $ echo $1 # Prints the first position
punky
3 $ echo $2 $3 # Prints the second and third position
tommy bert
4 $ echo $# # Prints the total number of positional parameters
4
5 $ set a b c d e f g h i j k l m
$ print $10 # Prints the first positional parameter followed by a 0
a0
$ echo ${10} ${11} # Prints the 10th and 11th positions
j k
6 $ echo $#
13
7 $ echo $*
a b c d e f g h i j k l m
8 $ set file1 file2 file3
$ echo \$$#
$3
9 $ eval echo \$$#
file3
10 $ set -- # Unsets all positional parameters
说明
1. set命令给位置参量赋值。专用变量$*包含所有的位置参量。
2. 显示第1个位置参量的值,punky。
3. 显示第2和第3个位置参量的值,tommy和bert。
4. 专用变量$#的值是当前已设置的位置参量的个数。
5. set命令复位所有的位置参量。原来的位置参量集被清除。要打印9以上的任意位置参量,就要用花括号把两个数字括起来。否则,就打印第一个位置参量的值,后跟另一个数。
6. 位置参量个数现在是13。
7. 显示所有位置参量的值。
8. 美元符被转义,$#是参数个数。echo命令显示$3,一个美元符号后跟位置参量的个数。
9. 执行命令之前,eval命令对命令行进行第二次解析。第一次由shell解析,将输出$3。第二次由eval解析,显示$3的值,即file3。
10. 带--选项的set命令清除或复位所有的位置参量。
其他特殊变量
shell有一些由单个字符组成的特殊变量。在字符前面加上美元符就能访问变量中保存的值。如表所示。
特殊变量
变 量
含 义
$
当前shell的PID
-
当前的sh选项设置
?
已执行的上一条命令的退出值
!
最后一个进入后台的作业的PID
范例13-71
1 $ echo The pid of this shell is $$
The pid of this shell is 4725
2 $ echo The options for this shell are $–
The options for this shell are imh
3 $ grep dodo /etc/passwd
$ echo $?
1
4 $ sleep 25&
4736
$ echo $!
4736
说明
1. 变量$保存这个进程的PID值。
2. 变量–列出当前这个交互式bash shell的所有选项。
3. grep命令在/etc/passwd文件中查找字符串dodo。变量?保存了上一条被执行的命令的退出状态。由于grep返回的值是1,因此可以假定grep的查找失败了。退出状态0代表成功退出。
4. 变量!保存上一条被放入后台的命令的PID号。sleep命令后面的&把命令发到后台。
分享到:
相关推荐
This book is aimed at administrators and those who have a basic knowledge of shell scripting and who want to learn how to get the most out of writing shell scripts. What You Will Learn Write ...
You can start writing scripts and one-liners by simply looking at the relevant recipe and its descriptions without any working knowledge of shell scripting or Linux. Intermediate / advanced users, ...
I assumes you have at least working knowledge of Linux i.e. basic commands like how to create, copy, remove files/directories etc or how to use editor like vi or mcedit and login to your system. ...
1. Shell编程:Linux下的Shell是一种命令行解释器,它提供了一个界面,用户通过这个界面输入命令来控制计算机。Shell脚本可以自动化重复任务,节省时间,实现复杂的自动化流程。 2. Linux工具集:Linux下有许多功能...
It serves as a textbook, a manual for self− study, and a reference and source of knowledge on shell scripting techniques. The exercises and heavily− commented examples invite active reader ...
A working knowledge of shell scripting is essential to anyone wishing to become reasonably proficient at system administration, even if they do not anticipate ever having to actually write a script. ...
shell-base64如何使用: $ printf 'Man' | ./encode_base64.shTWFu$ printf 'TWFu' | ./decode_base64.shMan$ printf 'Man is distinguished, not only by his reason, but by this singular passion from other ...
Shell_Bash_脚本编程技巧_,Linux_命令收集_,Powershell(BAT)脚本开发_Script_Knowledge
【标签】"knowledge note-taking Shell"为我们提供了更具体的信息线索。"knowledge"再次强调这是一个关于知识的学习资料,"note-taking"意味着其中包含有关如何有效记录和整理知识的方法和建议,这对于学习者来说是...
CIKM'20,全称为“国际信息与知识管理会议”(The ACM International Conference on Information and Knowledge Management),是一个在信息管理和知识发现领域具有高度影响力的学术会议。在这个会议中,研究者们分享...
元知识 :light_bulb: 知识库的列表 使用GitHub存储库记录所有内容。... 如果您有兴趣一次下载所有存储库,请参阅提供的讨论和shell脚本。 资源 有关非个人的更多知识共享存储库,您可以检查以下内容: 执照 CC0。
"knowledge:带有我想记住的东西的文本文件"这个标题暗示了一个包含各种重要知识和信息的文本集合。这些文本文件可能是开发者在学习过程中整理的笔记,或者是项目开发中的配置文档,方便以后查阅和使用。 描述中提到...
启动终端、节点命令提示符或 shell 并将目录更改为 Raneto 应用程序的根目录(app.js 和 config.js 所在的位置) 运行npm install安装节点依赖 要启动 Raneto,请运行npm start 在 Web 浏览器中访问...
IDLE是Python的交互式Shell,可以直接输入Python代码并执行。可以输入“help”、“copyright”、“credits”或“license”以获取更多信息。 knowledge point 4: 退出Python 如果想快速终止Python,可以输入exit()...