你能帮助我理解这个 shell 引用的解释吗?

你能帮助我理解这个 shell 引用的解释吗?

我正在尝试理解并重现这一点

我在书中读过这部分学习 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\""

您可以将其输入到终端中,通过右键单击并选择“粘贴”或CtrlShift++ 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

这应该导致: 在此处输入图片描述

笔记:

  1. $和变量名之间没有空格(例如$varname没有$ varname
  2. 字符\告诉 shell 将后面的字符视为普通字符。在这种情况下,您需要对变量周围的引号进行转义,以便它们出现在输出中,并对第一个变量进行转义,以便它显示为$frednot Four spaces between these words

这也可能有效,因此您不必转义引号,但您仍然需要转义变量:

echo "The value of \$fred is '$fred'".

相关内容