小编dcw*_*ers的帖子

在 Bash 中双引号和不双引号数组有什么区别?

在跟踪我的 shellscript 中的错误时,我在此代码片段中发现了以下行为:

declare -a filelist
readarray filelist < <(ls -A)
readonly filelist
for file in "${filelist[@]}"; do
  sha256sum ${filelist[$file]} | head -c 64
done
Run Code Online (Sandbox Code Playgroud)

当数组filelist不在双引号中时,命令成功。我一直在使用 ShellCheck 来尝试改进我的编码,它建议-

双引号以防止通配和分词。

在这种情况下,我不担心分词,但在很多其他情况下我很担心,所以我试图保持我的代码一致。但是,当我双引号数组时,命令失败。将代码简化为单个元素可得到以下结果:

bash-5.0# sha256sum ${filelist[0]} | head -c 64
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

bash-5.0# sha256sum "${filelist[0]}" | head -c 64
sha256sum: can't open 'file1
': No such file or directory
Run Code Online (Sandbox Code Playgroud)

我显然可以......不是双引号,因为在这种情况下分词不是问题。但我想发帖,因为将来可能会。

我的问题有两个部分:

  1. 除了上面的双引号数组之外,是否有“最佳实践”方法来防止分词?
  2. 数组中的单引号来自哪里? 编辑:没有单引号。单引号是显示无法打开的文件名的错误。

另外,出于好奇,为什么不echo ${filelist[0]}包含额外的换行符,但是echo "${filelist[0]}"呢?

shell bash array brace-expansion shellcheck

4
推荐指数
2
解决办法
923
查看次数

标签 统计

array ×1

bash ×1

brace-expansion ×1

shell ×1

shellcheck ×1