1

ファイル名を含むか、設定されていない可能性のある bash スクリプトにいくつかの変数があります。それらの内容は、追加の引数としてプログラムに渡す必要があります。ただし、変数が設定されていない場合、これは空の引数を残します。

$ afile=/dev/null
$ anotherfile=/dev/null
$ unset empty
$ cat "$afile" "$empty" "$anotherfile"
cat: : No such file or directory

引用符がなければ、追加の引数が単純に省略されるため、問題なく機能します。ただし、変数にはスペースが含まれる場合があるため、ここで引用符で囲む必要があります。

空のテストで行全体を単純にラップできることを理解しています。

if [ -z "$empty" ]; then
  cat "$afile" "$anotherfile"
else
  cat "$afile" "$empty" "$anotherfile"
fi

しかし、変数ごとに 1 つのテストを行うと、巨大で複雑な決定木が作成されます。

これに対するよりコンパクトなソリューションはありますか?引用符で囲まれた空の変数を省略するようにbashを作成できますか?

4

4 に答える 4

1

配列を使用して、純粋な bash ソリューションが可能です。while"$empty"は空の引数に評価され"${empty[@]}"、引用符で囲まれたすべての配列フィールドに展開されますが、この場合はどれもありません。

$ afile=(/dev/null)
$ unset empty
$ alsoempty=()
$ cat "${afile[@]}" "${empty[@]}" "${alsoempty[@]}"

配列がオプションではない状況では、pasaba por aqui のより用途の広い回答を参照してください。

于 2015-07-18T13:16:45.493 に答える
1

試してみてください:

printf "%s\n%s\n%s\n" "$afile" "$empty" "$anotherfile" | egrep -v '^$' | tr '\n' '\0' | xargs -0 cat
于 2015-07-18T10:34:45.457 に答える