関数引数として使用される環境変数を含むBash配列

関数引数として使用される環境変数を含むBash配列

一部の関数パラメータを bash 配列に格納しようとしていますが、その一部は環境変数の内容に基づいて定義されており、実際に実際の値として「拡張」されていません。 (十分に明確にしてください。):

例:

fileprefix='20200222_*'
test=1
args=( '-F' )
[[ "${test}" == 1 ]] && args+=( '-la "${fileprefix}"' )

ただし、以下を実行するとエラーが報告されます。

$ ls "${args[@]}"

ls: invalid option -- ' '
Try 'ls --help' for more information.

そして:

$ echo "${args[@]}"

-F -la "${fileprefix}"

しかし:

$ echo "${fileprefix}"
20200222_*

私は期待:

$ ls "${args[@]}"

-rw-r--r-- 1 user user 0 Jul  4 19:37 20200222_a.txt
-rw-r--r-- 1 user user 0 Jul  4 19:38 20200222_b.txt
-rw-r--r-- 1 user user 0 Jul  4 19:39 20200222_c.txt
-rw-r--r-- 1 user user 0 Jul  4 19:40 20200222_d.txt

だから私の質問は:${fileprefix}パラメータ配列を使用してコマンドを実行するときに変数の内容をどのように「拡張」するのですか?ls

私はここで興味深いものを見つけることができませんでした。https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html

答え1

... args+=( '-la "${fileprefix}"' )

ここでは'-la "${fileprefix}"'引用符が付いているので、空白、引用符、ドル記号、中括弧、およびすべての項目とともに配列の要素として格納されます。${fileprefix}文字列が一重引用符で囲まれているため、拡張されません。ls結局、これを完全なパラメータとして取り、空白が有効なオプション文字ではないと文句を言います。

あなたが〜した後考える ${fileprefix}拡張してファイル名パターン/globとして使用するには、それを維持する必要があります。引用しない。 (また、トークン化されるため、IFSスペースが含まれているか(またはデフォルト以外のものに変更するか)問題になります。)また、-la別の要素を作成する必要があります。

だから:

args+=( -la ${fileprefix} )

(これはecho "${args[@]}"配列を見るのに最適な方法ではありません。空白で連結されたすべての引数が印刷されるため、空白のある配列要素の1つと空白のない2つの配列要素を区別することechoは困難です。たとえば、foo barvs .foobar. printf ":%s\n" "${array[@]}"(少なくともデータに改行文字が含まれ始めるか、配列が空になるまで)。

関連情報