Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多个参数从文本文件传递到bash脚本_Bash - Fatal编程技术网

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

将多个参数从文本文件传递到bash脚本,bash,Bash,我有一个包含三个参数的bash脚本,还有一个包含三列的文本文件。我希望脚本将文本文件的第一、第二和第三列作为bash脚本的第一、第二和第三个参数 我是一个shell脚本的初学者,我运行的程序相当简单,效率不是很重要,因此希望能有更简单的修复:) 这是我想做的一个例子。 我有一个名为food.txt的文本文件,其中包含以下文本: 我有一个像这样的menu.sh脚本 我希望menu.sh输出以下内容: 但它输出的却是: 提前感谢您的帮助 正确使用bash的读取功能: #!/bin/bash whi

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

我是一个shell脚本的初学者,我运行的程序相当简单,效率不是很重要,因此希望能有更简单的修复:)

这是我想做的一个例子。

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

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

我希望menu.sh输出以下内容:

但它输出的却是:


提前感谢您的帮助

正确使用bash的读取功能:

#!/bin/bash

while read -r arg_1 arg_2 arg_3; do 
    echo "${arg_1}:${arg_2},${arg_3}"
done < food.txt
#/bin/bash
而read-r arg_1 arg_2 arg_3;做
回声“${arg_1}:${arg_2},${arg_3}”
done
你见过面

检查

你需要使用

while read -r a1 a2 a3; do
    echo "$a1:$a2:$a3"
done < file
读取时-r a1 a2 a3;做
回声“$a1:$a2:$a3”
完成<文件
如果您添加了另一个字段/列,只需将
2,3
更改为
2,3,4
2-4
。如果每行字段数量可变,可以将其更改为
2-

另一种有趣(但不是最佳)的方法是使用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值非常重要。正如我所说的,这不是最佳答案,其他答案更好,但这仍然是另一个选项

或者您可以:

#!/bin/bash

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


TLDP不是一个好的资源,TLDP bash指南已经过时,在某些情况下完全是错误的。他们不在这个话题中是有原因的。(格雷博特)#bash@freenode)@GillesQuenot,我想GNU版本应该足够了
#!/bin/bash

while read -r arg_1 arg_2 arg_3; do 
    echo "${arg_1}:${arg_2},${arg_3}"
done < food.txt
while read -r a1 a2 a3; do
    echo "$a1:$a2:$a3"
done < file
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
#!/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
#!/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