改行に分割

改行に分割

パラメータの個々の行を処理できる他の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"

  1. POSIX

    theone()
    {
        printf '%s\n' "$@" |
            while IFS= read -r vl
            do
                printf '## vl: %s ##\n' "$vl"
            done
    }
    
  2. 次のような殻bash

    theone()
    (
        for arg in "$@"
        do
            while IFS= read -r vl
            do
                printf '## vl: %s ##\n' "$vl"
            done <<< "$arg"
        done
    )
    
  3. 貝殻もあります。bash

    theone()
    (
        for arg in "$@"
        do
            readarray -t vls <<<"$arg"
    
            for vl in "${vls[@]}"
            do
                printf '## vl: %s ##\n' "$vl"
            done
        done
    )
    

実際に単一(複数行)パラメータのみを渡す場合は、最も外側のループを削除してこれらすべてを簡素化できます。たとえば、最後の項目は次のように作成できます。

  1. 次のような殻bash

    theone()
    {
        local vls vl
    
        readarray -t vls <<<"$1"
    
        for vl in "${vls[@]}"
        do
            printf '## vl: %s ##\n' "$vl"
        done
    }
    

関連情報