代码之家  ›  专栏  ›  技术社区  ›  Caucasian Malaysian

将文件内容循环到参数

  •  0
  • Caucasian Malaysian  · 技术社区  · 6 年前

    你们都知道,对吧? Looping through the content of a file in 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
    

    文件文本内容

    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美元换成苹果水果,2美元换成苹果蔬菜,3美元换成蔬菜水果。然后当它击中 done 我想用它来代替1美元的梨子水果,2美元的梨子蔬菜,等等。

    相关小问题

    另外,为了让它发挥作用,当你输入这个脚本时,你是否不添加任何参数

    script.sh
    

    或者你真的需要放点东西进去吗,如果你做了什么?因为争论总是在变。

    script.sh mystery mystery mystery
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   chepner    6 年前

    三行,三行 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
    

    这里没有真正的理由涉及位置参数;只需使用正则变量。

        2
  •  0
  •   builder-7000    6 年前

    你可以用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