我正在尝试理解并重现这一点
我在书中读过这部分学习 Bash Shell;
我对此的问题如下:
“请注意,在这些 echo 示例中,我们在变量(以及包含它们的字符串)周围使用了双引号。在第 1 章中,我们说过,双引号内的某些特殊字符仍会被解释,而单引号内的任何特殊字符都不会被解释。
双引号中还有一个特殊字符,那就是美元符号,表示变量会被求值。在某些情况下,可以不用双引号;例如,我们可以这样编写上述 echo 命令:
$ echo The value of \$ varname is \"$ varname \".
但双引号通常更正确。原因如下。假设我们这样做:
$ fred='Four spaces between these words.'
然后如果我们输入命令# echo $fred,结果将是:
Four spaces between these words.
多余的空格怎么了?如果没有双引号,shell 会在替换变量的值后将字符串拆分为单词,就像它在处理命令行时通常所做的那样。双引号绕过了这一部分过程(通过让 shell 认为整个引用的字符串是一个单词)。
因此命令 echo "$fred" 打印以下内容:
Four spaces between these words.
当我们开始处理包含用户或文件输入的变量时,单引号和双引号之间的区别变得尤为重要。”
我的问题
我尝试过用这个练习,但我很困惑。我是否应该把
$ echo The value of \$ varname is \"$ varname \".
$ fred='Four spaces between these words.'
在文件中?比如输入 # nano,然后将其放入其中?或者我只是将其输入到终端中?两者都不起作用。当我输入 # nano fred 并将其放入该文件并使其可执行并将“varname”更改为“fred”并运行 ./fred 时,我得到了以下结果:
The value of $fred is ""
你能解释一下我做错了什么吗?
答案1
我尝试为您稍微分解一下这一点,并使用您自己的示例/文本,请查看:
$ cat fred
#!/bin/bash
fred='Four spaces between these words.'
echo "The value of \$fred is $fred"
echo "The next line being printed is simply the results of # echo \$fred"
echo $fred
运行上面的 bash 脚本会将以下内容打印到终端/stdout:
The value of $fred is Four spaces between these words.
The next line being printed is simply the results of # echo $fred
Four spaces between these words.
您也可以在此处观看此终端视频: http://showterm.io/98f56243f60551b338b9f
答案2
我认为你应该放:
fred='Four spaces between these words'
echo "The value of \$fred is \"$fred\""
您可以将其输入到终端中,通过右键单击并选择“粘贴”或Ctrl“ Shift++ V”),或者一次输入一行。例如:
您还可以创建一个脚本来运行nano ./echofredscript
并粘贴:
#!/bin/bash
#The bit above is a shebang line (look it up on wikipedia).
#These are comments and will be ignored
fred='Four spaces between these words'
echo "The value of \$fred is \"$fred\""
然后您可以使用Ctrl+保存它并使用+O退出,然后运行此命令以使其可执行:CtrlX
chmod +x ./echofredscript
然后运行脚本:
./echofredscript
这应该导致:
笔记:
$
和变量名之间没有空格(例如$varname
没有$ varname
)- 字符
\
告诉 shell 将后面的字符视为普通字符。在这种情况下,您需要对变量周围的引号进行转义,以便它们出现在输出中,并对第一个变量进行转义,以便它显示为$fred
notFour spaces between these words
。
这也可能有效,因此您不必转义引号,但您仍然需要转义变量:
echo "The value of \$fred is '$fred'".