我正在尝试将包含几个用户输入变量的命令的输出重定向到数组。我第一次尝试这个脚本 -
echo "Type the ACL name"
read acl
echo "Type the DATACENTER name"
read dc
echo "ACL is $acl, DC is $dc"
mkdir ~/$acl
device=($(grep -iEr $acl ~/sync-configs/$dc/configs/* | awk -F ':' {'print $1'} | awk -F '/' {'print $NF'} | sort | uniq))
该脚本创建了 ~/acl 目录,但 grep 对我不起作用。然后,经过一些研究后,我调整了 grep 将变量放在双引号中,如下所示 -
echo "Type the ACL name"
read acl
echo "Type the DATACENTER name"
read dc
echo "ACL is $acl, DC is $dc"
mkdir ~/$acl
device=($(grep -iEr "$acl" ~/sync-configs/"$dc"/configs/* | awk -F ':' {'print $1'} | awk -F '/' {'print $NF'} | sort | uniq))
这似乎工作正常,我能够看到设备数组中的元素。
我的问题是为什么在将 $acl 和 $dc 提供给数组时需要添加引号,但该命令mkdir ~/$acl
不需要任何引号?有人可以澄清这一点吗?
答案1
一般来说,引号用于保留值的字面含义,并避免解释器对特殊字符进行转换以及其他操作,例如参数扩展和分词。
如果您使用"
引用单词,变量仍然会扩展,但不会执行单词拆分。
单词拆分是 shell 获取字符串并从概念上将其分解为不同单词或标记的过程。
因此,如果您在阅读提示时输入此内容
bangalore data center
你的命令将像这样展开:
带引号
grep -iEr "$acl" ~/sync-configs/"$dc"/configs/*
变成
grep -iEr bangalore data center ~/sync-configs/"$dc"/configs/*
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pattern argument File/s argument to grep
to grep
不带引号
grep -iEr $acl ~/sync-configs/"$dc"/configs/*
变成
grep -iEr bangalore data center ~/sync-configs/"$dc"/configs/*
^^^^^^^^^ |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pattern | File/s argument to grep
注意:上面的内容$dc
也会被扩展。