将多个参数从文本文件传递给bash脚本

时间:2018-03-13 18:46:46

标签: bash

我有一个带有三个参数的bash脚本,我有一个包含三列的文本文件。我希望脚本将文本文件的第一,第二和第三列作为bash脚本的第一,第二和第三个参数。

我是shell脚本的初学者,我正在运行效率不是很重要的相当简单的程序,所以更简单的修复程序将不胜感激:)

以下是我想要做的一个例子。

我有一个名为food.txt的文本文件,其中包含以下文字:

fruits apples bananas
vegetables kale broccoli
meats pork beef
desserts cake pie

我有一个像这样的menu.sh脚本

#!/bin/bash

arg_1=$1
arg_2=$2
arg_3=$3

for arg_1 in $(cat food.txt)
do
    echo "${arg_1}:${arg_2},${arg_3}"
done

我想将menu.sh输出:

fruits:apples,bananas
vegetables:kale,broccoli
meats:pork,beef
desserts:cake,pie

但它输出了这个:

fruits:,
apples:,
bananas:,
vegetables:,
kale:,
...

提前感谢您的帮助!

5 个答案:

答案 0 :(得分:1)

使用 bash read 功能的正确方法:

#!/bin/bash

while read -r arg_1 arg_2 arg_3; do 
    echo "${arg_1}:${arg_2},${arg_3}"
done < food.txt

https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins

答案 1 :(得分:0)

您遇到了bash word spliting

检查bash FAQ 1

您需要使用

while read -r a1 a2 a3; do
    echo "$a1:$a2:$a3"
done < file

答案 2 :(得分:0)

cat food.txt | while read line
do
  header="$(echo "$line" | cut -f1 -d' ')"
  fields="$(echo "$line" | cut -f2,3 -d' ' | tr ' ' ,)"
  echo "$header:$fields"
done

如果您添加了其他字段/列,则可以将2,3更改为2,3,42-4。如果每行都有可变数量的字段,则可以将其更改为2-

答案 3 :(得分:0)

另一种有趣(但不是最佳)的方法是使用IFS var(内部字段分隔符)。它在bash中用于说明如何在for循环中分隔字段:

#!/bin/bash

file=$(cat food.txt)
IFS_OLD=$IFS
IFS=$'\n'
for line in $file; do
        name=$(echo "$line" | cut -d' ' -f1 )
        element1=$(echo "$line" | cut -d' ' -f2)
        element2=$(echo "$line" | cut -d' ' -f3)
        echo "$name:$element1,$element2"
done
IFS=$IFS_OLD

请注意,备份和恢复原始IFS值非常重要。正如我所说,不是最优,其他答案更好,但这仍然是另一种选择

答案 4 :(得分:0)

或者你可以这样做:

#!/bin/bash

IFS=$'\n'                                                                   
for arg in $(cat food.txt); do                                           
     echo  $arg | awk '{ print $1":"$2","$3 }'                               
done 

或:

#!/bin/bash

awk '{ print $1":"$2","$3 }' food.txt