将带有变量的命令的输出重定向到数组

将带有变量的命令的输出重定向到数组

我正在尝试将包含几个用户输入变量的命令的输出重定向到数组。我第一次尝试这个脚本 -

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也会被扩展。

相关内容