変数を含むコマンドの出力を配列にリダイレクトする

変数を含むコマンドの出力を配列にリダイレクトする

複数のユーザー入力変数を含むコマンドの出力を配列にリダイレクトしようとしています。このスクリプトを使用した最初の試み -

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

通常、引用符は値の文字通りの意味を保存し、特殊文字のソルバー変換やパラメータの拡張やトークン化などの他の操作を防ぐために使用されます。引用符付き単語を
使用している場合、"変数は引き続き拡張されますが、単語分割は実行されません。
単語分割は、シェルが文字列を取得し、概念的にそれを別の単語またはトークンに分割するプロセスです。
したがって、プロンプトの読み込み中にこれを入力すると、

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も拡張されています。

おすすめ記事