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