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命令后面的&把命令发到后台。

你可能感兴趣的:(apple,脚本,F#,J#,bash)