在跟踪我的 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)
我显然可以......不是双引号,因为在这种情况下分词不是问题。但我想发帖,因为将来可能会。
我的问题有两个部分:
另外,出于好奇,为什么不echo ${filelist[0]}
包含额外的换行符,但是echo "${filelist[0]}"
呢?