`
lykm02
  • 浏览: 50963 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

Shell knowledge

阅读更多
变量修饰符扩展
${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命令后面的&把命令发到后台。
分享到:
评论

相关推荐

    Linux Shell Scripting Essentials 无水印pdf 0分

    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 ...

    Linux Shell Scripting Cookbook - Third Edition

    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, ...

    shell编程入门教程

    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. ...

    basic knowledge of linux

    1. Shell编程:Linux下的Shell是一种命令行解释器,它提供了一个界面,用户通过这个界面输入命令来控制计算机。Shell脚本可以自动化重复任务,节省时间,实现复杂的自动化流程。 2. Linux工具集:Linux下有许多功能...

    abs-guide.rar_Shell ABS_linux manual

    It serves as a textbook, a manual for self&#8722 study, and a reference and source of knowledge on shell scripting techniques. The exercises and heavily&#8722 commented examples invite active reader ...

    shell for doudou

    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:POSIX Shell的Base64实现

    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)脚本开发_

    Shell_Bash_脚本编程技巧_,Linux_命令收集_,Powershell(BAT)脚本开发_Script_Knowledge

    knowledge:everything关于一切的笔记

    【标签】"knowledge note-taking Shell"为我们提供了更具体的信息线索。"knowledge"再次强调这是一个关于知识的学习资料,"note-taking"意味着其中包含有关如何有效记录和整理知识的方法和建议,这对于学习者来说是...

    CIKM'20,为推荐生成神经模板解释_Python_Shell_下载.zip

    CIKM'20,全称为“国际信息与知识管理会议”(The ACM International Conference on Information and Knowledge Management),是一个在信息管理和知识发现领域具有高度影响力的学术会议。在这个会议中,研究者们分享...

    meta-knowledge:knowledge知识库的列表

    元知识 :light_bulb: 知识库的列表 使用GitHub存储库记录所有内容。... 如果您有兴趣一次下载所有存储库,请参阅提供的讨论和shell脚本。 资源 有关非个人的更多知识共享存储库,您可以检查以下内容: 执照 CC0。

    knowledge:带有我想记住的东西的文本文件

    "knowledge:带有我想记住的东西的文本文件"这个标题暗示了一个包含各种重要知识和信息的文本集合。这些文本文件可能是开发者在学习过程中整理的笔记,或者是项目开发中的配置文档,方便以后查阅和使用。 描述中提到...

    knowledge-base

    启动终端、节点命令提示符或 shell 并将目录更改为 Raneto 应用程序的根目录(app.js 和 config.js 所在的位置) 运行npm install安装节点依赖 要启动 Raneto,请运行npm start 在 Web 浏览器中访问...

    12岁的少年教你用Python做小游戏.pdf

    IDLE是Python的交互式Shell,可以直接输入Python代码并执行。可以输入“help”、“copyright”、“credits”或“license”以获取更多信息。 knowledge point 4: 退出Python 如果想快速终止Python,可以输入exit()...

Global site tag (gtag.js) - Google Analytics