パラメータの個々の行を処理できる他のbash関数の実装を使用してきました。
var1="
First Argument
A new line"
var2="
Second Argument
A new line"
呼び出し機能は
theone $var
噴射は禁止されています。
しかし、関数内ではまだ$@
。
theone ()
{
for vl in "$@"; do
printf '%s\n' "$vl"
done
}
私が望むのは改行文字で分割することです。
答え1
theone $var
単語ごとに分割を呼び出します$var
。最初の引数はFirst
、2番目の引数はArgument
、3番目の引数はですA
。このアプローチを使用すると、埋め込まれた改行文字が失われ、引用符のない変数と同様に、文字列内のシェルワイルドカード(*
、、、、)を含むすべての単語がワイルドカードとして扱われ、現在のディレクトリ[
一致の名前と一致します。現在のディレクトリにあるファイルを呼び出している場合、「Are you は確実ですか?一般的に言えば、これは良い考えではありません。]
?
surety
あなたの言葉によると前の質問theone "$var"
私は単語の区切りが発生せず、複数行のパラメータを持つ次のように書く必要があることを提案しますtheone
。
各行を個別に処理するには、$var
さまざまな構成を提案できます。それぞれで、printf
この行は内部ループで処理される内容を明確に示すために作成されました。それぞれ電話してくださいtheone "$var"
:
POSIX
theone() { printf '%s\n' "$@" | while IFS= read -r vl do printf '## vl: %s ##\n' "$vl" done }
次のような殻
bash
theone() ( for arg in "$@" do while IFS= read -r vl do printf '## vl: %s ##\n' "$vl" done <<< "$arg" done )
貝殻もあります。
bash
theone() ( for arg in "$@" do readarray -t vls <<<"$arg" for vl in "${vls[@]}" do printf '## vl: %s ##\n' "$vl" done done )
実際に単一(複数行)パラメータのみを渡す場合は、最も外側のループを削除してこれらすべてを簡素化できます。たとえば、最後の項目は次のように作成できます。
次のような殻
bash
theone() { local vls vl readarray -t vls <<<"$1" for vl in "${vls[@]}" do printf '## vl: %s ##\n' "$vl" done }