Bash

將帶有變數的命令的輸出重定向到數組

  • May 13, 2017

我正在嘗試將包含幾個使用者輸入變數的命令的輸出重定向到數組。我首先嘗試了這個腳本 -

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 and $ 將它們提供給數組時使用 dc 引號,但該命令mkdir ~/$acl不需要任何引號?有人可以澄清這一點嗎?

一般來說,引號用於保留值的字面含義,並避免解釋器對特殊字元進行轉換和其他操作,例如參數擴展和分詞。

如果您使用"引用單詞,變數仍然會被擴展,但不會進行分詞。

單詞拆分是外殼獲取字元串並在概念上將其分解為不同單詞或標記的過程。

因此,如果您在閱讀提示符下輸入此內容

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也會被擴展。

引用自:https://unix.stackexchange.com/questions/364792