2019年8月21日 星期三

使用shell变量的值

正如前面所讲的,为了使用shell变量的值,可以键入一个$(美元)字符,后面跟用花括号括起来的名称。例如:
echo “My userid is ${USER}”

出于方便考虑,如果变量名与其他字符之间不需要分隔,可以省略掉花括号。例如:
echo “My userid is $USER.”

提示:
当使用变量的值时,使用花括号是一种好习惯,即便不是必须。
这样做是为了增强命令的可读性,特别是在shell脚本中。此外,因为花括号将变量隔离,所以它们还可以帮助避免难以理解的语法问题,否则可能会导致极大的麻烦。

在shell提示中使用变量的值相当直接。例如,要将用户标识插入到提示中,可以使用:

export PS1=“${USER}$ ”
set prompt = “${USER}% ”


(第一条命令针对Bourne shell,第二条命令针对C-shell。)
如果用户标识是harley(一种表现个性的方式),这条命令将生成如下所示的提示:
harley$
harley%


您希望在shell提示中使用哪个环境变量呢?原则上可以使用任何变量。但是,大多数环境变量并不适合在提示中使用。为了帮助缩小选择范围,下表我列举了我认为最重要的shell提示。如果希望体验一下,只需从下述命令中选择一个适合自己的shell命令,然后将变量替换为下表中的变量即可。

export PS1=“${VARIABLE}$ ”
set prompt = “${VARIABLE}% ”


增强shell提示的一种方法就是在shell提示中包含有用或者有趣的变量的值。本表只显示适合于shell提示的环境变量。
最左边的一列说明哪个shell支持这个变量:B=Bash; K=Korn Shell; C=C-Shell; T=Tcsh。圆点表示相应的shell不支持该选项。
大多数人喜欢使用LOGNAME、PWD、SHELL或者USER。但是,对我而言,可以一直看个不停的最有趣的变量是RANDOM和SECONDS。但是,只有Bash和Korn shell中才有这两种变量。下面体验这两个变量的命令:

export PS1= ‘Your lucky number is ${RANDOM} $ ’
export PS1=“Working time: ${SECTION} seconds $ ”


引用变量时使用哪类引号
仔细看看上面的两个例子:

export PS1= ‘Your lucky number is ${RANDOM} $ ’
export PS1=“${USER}$ ”


您是否注意到,其中有一条命令是单引号,而另一条命令使用双引号?这一区别描述了一个细小但是重要的知识点,希望您能够理解,特别是在您打算编写shell脚本时。
使用两种不同类型引号的原因在于所使用的两个变量,其中一个变量发生变化,而另一个变量不发生变化。更准确地说,就是RANDOM的值是一个随机数,每次查看它时都不相同。而USER的值是用户标识,总是保持不变。

在引用${USER}时使用双引号,从而允许将$字符解释成元字符。这意味着在处理该命令时USER的值就固定下来了,这样没有问题,因为USER的值永远不发生改变。
在引用${RANDOM}时使用的是单引号,从而允许保留$字符的含义,以便于稍后使用。这一技术确保直至创建世界提示才对RANDOM求值。通过这种方式,当要显示一个新的提示时,shell就使用这个时刻RANDOM所拥有的值。
此时,回想一下抢引用和弱引用会有帮助。总之:

单引号(‘•••’),也称为强引用,引用所有内容。在单引号中,没有字符拥有特殊的含义。
双引号(‘•••’),也称为弱引用,除3个元字符$(美元)、`(反引号)、和\(反斜线)外引用所有内容。在双引号中,这3个字符还保留它们各自的特殊含义。
因此,当在命令中使用 ‘${VARIABLE}’时,所有的字符都取字面上的含义,$字符保留下来,以便稍后使用其原本含义。当使用“${VARIABLE}”时,$字符就被解释成元字符,而整个表达式在这个时刻就被替换为VARIABLE的值。
因此,当需要引用变量时,心里要想一想:“该变量的值在使用之前是否会变化?”如果答案是肯定的,则使用强引用(也就是单引号)来防止$字符被解释,直至需要它们。否则,使用弱引用(双引号),从而允许$字符被立即解释。

沒有留言:

張貼留言