我在 bash 中编写了一个小脚本,但只有当我将字符串存储为变量时它才起作用,我想知道为什么。总结如下:
当我使用字符串本身时,bash 将其视为单个实体
for word in "this is a sentence"; do
echo $word
done
# => this is a sentence
Run Code Online (Sandbox Code Playgroud)
如果我将完全相同的字符串保存到变量中,bash 会迭代这些单词
sentence="this is a sentence"
for word in $sentence; do
echo $word
done
# => this
# is
# a
# sentence
Run Code Online (Sandbox Code Playgroud)
引号告诉 bash在计算表达式时将引号中的内容视为参数列表中的单个参数。引号(除非用 \ 或 ' 保护)将被删除。
echo "" # prints newlines, no quotes
echo '""' # Print ""
export X='""'
env | grep X # X contains ""
export X=""
env | grep X # X is empty
Run Code Online (Sandbox Code Playgroud)
当您使用变量时,bash 按原样解压它(即,就像您在变量的位置键入变量的内容一样)。对于 for 循环,bash 通过用空格分隔 for 循环的参数来确定要迭代的列表元素,但将(一如既往)受引号保护的项视为单个参数/列表元素。您的变量不包含引号 - 项目被视为单独的参数。