我编写了一个非常基本的命令替换脚本,如下所示:
#!/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
只获取字符串foo
和bar
,并且它会打印这些字符串,它们之间有一个空格,因为这就是它组合多个参数的编码方式。如果您编写echo "foo bar"
,则echo
获取单个字符串foo bar
并按原样打印它。