我已经执行了以下命令序列:
$ now=$(date)
$ echo _$now_
_
$ echo _ $now _
_ Mon Sep 22 09:53:44 IST 2014 _
_$now_
为什么只有 的输出_
?
答案1
从man bash
:
DEFINITIONS
The following definitions are used throughout the rest of this document.
blank A space or tab.
word A sequence of characters considered as a single unit by the shell.
Also known as a token.
name A word consisting only of alphanumeric characters and underscores,
and beginning with an alphabetic character or an underscore. Also
referred to as an identifier.
...
PARAMETERS
A parameter is an entity that stores values. It can be a name, a number,
or one of the special characters listed below under Special Parameters.
A variable is a parameter denoted by a name.
变量只能包含字母、数字和下划线。因此,now_
变量名是有效的,并按此进行解释。
您可以用不同的方式来界定变量名称:
_"$now"_
_${now}_
_$now"_"
_$now'_'
或者以上任意组合。
答案2
因为_
是变量名的一部分echo _$now_
改用echo \_$now\_
。
您也可以在线性命令中使用它:echo _$(date)_
答案3
请稍等片刻,这需要一点解释。
首先,为什么输出是_ $(date) _
?_ Mon Sep 22 03:30:34 MDT 2014 _
因为这实际上是告诉 echo 先输出 _ ,然后输出 $(date) ,然后输出 _ 。空格分隔 echo 的变量。
现在尝试echo _$(date)
,注意_
和之间没有空格$(date)
。在这种情况下,输出将是_Mon Sep 22 03:32:40 MDT 2014
。这有什么用?你告诉echo
将下划线与 的输出连接起来$(date)
。
尝试使用 进行同样的操作_$PWD
,它将使用下划线连接您的工作目录。现在尝试echo $PWD_
。输出将为空白。为什么?因为PWD_
是不存在的环境变量,并且正如其他人提到的那样_
是环境变量的有效字符,例如$XDG_CURRENT_DESKTOP
。
那么为什么_$PWD_
要给出_
?因为你告诉echo
要_
与不存在的环境变量的输出连接。所以_
打印了,但$PWD_
输出是空白的,所以你实际上看到的是_
与那个空白输出连接的。
答案4
_$now_
被解释为
_${now_}
在你的情况下,这显然是 '_' 和 '' 的字符串连接。因此使用
_${now}_
相反,它读起来更加清晰。