bugfix> bash > 投稿

あなたは皆これを知っていますか? Bashのファイルのコンテンツをループする

だから私がやりたいのは、ファイルの内容を引数にループすることです。どの変更出力など

私が試したもの:
while read $1 & $2 & $3; do
#also tried:
#while read $1 $2 $3; do
    echo ${1}
    echo ${2}
    echo ${3}
    ./${1}.sh & ./${2}.sh & ./${3}.sh
done <file.txt

結果:
#arguments aren't echoed
./script.sh: line 31: ./.sh: No such file or directory
./script.sh: line 31: ./.sh: No such file or directory
./script.sh: line 31: ./.sh: No such file or directory
#scripts aren't executed

file.txtの内容
apple_fruit
#$1
apple_veggie
#$2
veggie_fruit
#$3
pear_fruit
#$1
pear_veggie
#$2
veggie_fruit
#$3

これは、このパターンでこのようにループします^^

また、ファイルをこれに変更しようとしました:
apple_fruit apple_veggie veggie_fruit
pear_fruit pear_veggie veggie_fruit

手短に:

$1をapple_fruitに、$2をapple_veggieに、$3をveggie_fruitに置き換えたいです。次に、 done にヒットしたとき$1をpear_fruitに、$2をpear_veggieに、などのように置き換えたいです。

関連するミニ質問

また、これを機能させるために、このスクリプトを入力するときに引数を追加しませんか

script.sh

それとも、実際に何かを入れなければならないのですか?なぜなら、議論は常に変化するからです。

script.sh mystery mystery mystery

回答 2 件
  • 3行、3つの read s:

    while IFS= read -r l1
          IFS= read -r l2
          IFS= read -r l3
    do
        echo "$l1, $l2, and $l3"
    done <<EOF
    apple_fruit
    apple_veggie
    veggie_fruit
    pear_fruit
    pear_veggie
    veggie_fruit
    EOF
    
    

    出力は

    apple_fruit, apple_veggie, and veggie_fruit
    pear_fruit, pear_veggie, and veggie_fruit
    
    

    ここで位置パラメータを使用する本当の理由はありません。通常の変数を使用するだけです。

  • あなたはbash readarray を使うことができます  行を配列に読み込むための組み込み( line ):

    readarray line < file.txt
    echo ${line[@]}
    
    

    出力:

    apple_fruit                                                              
    apple_veggie                                                             
    veggie_fruit                                                             
    pear_fruit                                                               
    pear_veggie                                                              
    veggie_fruit
    
    

    その後、あなたはできる

    printf './%s.sh & '  "${line[@]}" | sed 's/ \& $//'        
    
    

    どの出力

    ./apple_fruit.sh & ./apple_veggie.sh & ./veggie_fruit.sh & ./pear_fruit.sh & ./pear_veggie.sh & ./veggie_fruit.sh
    
    

あなたの答え