echo 带有命令替换内容的变量

echo 带有命令替换内容的变量

我编写了一个非常基本的命令替换脚本,如下所示:

#!/bin/bash
files=$(ls *.fastq);
echo $files

该目录包含一堆 .fastq 文件,我只想使用 echo 命令输出它们

上面的脚本输出 fastq 文件,每个 fastq 文件名之间有一个空格。

当我以这种方式使用它时

#!/bin/bash
files=$(ls *.fastq);
echo "$files"

它在新行上打印结果。

为什么会这样呢?这与命令替换有关吗?

谢谢

答案1

您有换行符,因为ls将它们放在不同的行上。换行符在没有引号的情况下消失,因为 shell (bash) 将每个不带引号的空格分隔文本作为单独的参数传递给命令。

注意:命令替换是由 shell 完成的,不由ls,所以你不需要ls

因此你可以做

#!/bin/bash
echo *.fastq

或者

#!/bin/bash
files="*.fastq"
echo "$files"

答案2

引用变量时,通常建议将其名称用双引号引起来。这可以防止重新解释带引号的字符串中的所有特殊字符——除了$`(反引号)和\(转义)。保留$为双引号内的特殊字符允许引用带引号的变量(“$variable”),即用变量的值替换该变量。

使用双引号来防止分词。用双引号括起来的参数将自身呈现为单个单词,即使它包含空格分隔符也是如此。

例如

variable1="a variable containing five words"
COMMAND This is $variable1    # Executes COMMAND with 7 arguments:
# "This" "is" "a" "variable" "containing" "five" "words"

COMMAND "This is $variable1"  # Executes COMMAND with 1 argument:
# "This is a variable containing five words"

仅当单词拆分或空格保留存在问题时,才需要将 echo 语句的参数括在双引号中。

有关更多信息和示例,请访问这里

答案3

当您引用一个没有引号的变量时(例如echo $files),shell 将在空格上分割该值并将每个术语作为单独的命令行选项传递。换行符的处理方式与任何其他空格相同。程序echo根本看不到换行符;它只是获取一个字符串数组,每个字符串都是一个文件名。

当您在引号中引用变量时(例如echo "$files"),shell 不会进行任何空格分割;相反,它传递整个值,未修改,作为单身的争论。该echo程序接收一个包含换行符的长字符串。

除了变量之外,这与在文字值周围加上引号所得到的行为相同。如果你写echo foo bar,shell 会去掉空格,echo只获取字符串foobar,并且它会打印这些字符串,它们之间有一个空格,因为这就是它组合多个参数的编码方式。如果您编写echo "foo bar",则echo获取单个字符串foo bar并按原样打印它。

相关内容