我正在尝试编写一个 bash 脚本来读取文件作为输入并将该文件中的值/数据附加到变量中,并且应根据文件中的输入行在每次迭代中更新变量的值。
例如:输入文件如下所示:
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
当我通过我的 shell 脚本读取此内容时,我将定义 5 个变量,分别为 a、b、c、d、e。
第一次迭代:
变量值应与输入文件的第一行一起分配。
a=100
b=Thomas
c=Manager
d=Sales
e=$5000
第二次迭代:
变量值应与输入文件的第二行一起分配。
a=200
b=Jason
c=Developer
d=Technology
e=$5500
等等...
请任何人提供一些关于如何编写脚本来读取这种格式的值的建议。
答案1
您可以使用read
内置命令带有-a
循环选项,用于将文件的每一行读取为数组。然后,您可以将数组元素的值分配给所需的变量(或者您可以在脚本中直接使用数组元素):
#!/bin/bash
IN_FILE='./in-file.txt'
while read -ra LINE
do
a="${LINE[0]}"; b="${LINE[1]}"; c="${LINE[2]}"
d="${LINE[3]}"; e="${LINE[4]}"
echo -e "$a\n$b\n$c\n$d\n$e\n"
done < "$IN_FILE"
另一种方法是将某一行的每一列的值直接分配给变量。以下示例使用 bash 函数,该函数将为变量提供新的调用时的值。该函数有一个输入参数,用于确定要解析文件中的哪一行。
#!/bin/bash
IN_FILE='./in-file.txt'
args_feed() {
read -r a b c d e <<< "$(sed "$1 q;d" "$IN_FILE")"
}
# -----------------
# Examples of usage
# -----------------
# Parse the third line
args_feed 3
echo -e "$a\n$b\n$c\n$d\n$e\n"
# Sequential call - First iteration
args_feed $((++LINE_NR))
echo -e "$a\n$b\n$c\n$d\n$e\n"
# Sequential call - Second iteration
args_feed $((++LINE_NR))
echo -e "$a\n$b\n$c\n$d\n$e\n"
# Parse the entire file
NR_LINES="$(cat "$IN_FILE" | wc -l)"
for LINE_NR in $(seq 1 $NR_LINES)
do
args_feed "$LINE_NR"
echo -e "$a\n$b\n$c\n$d\n$e\n"
done
笔记:
默认值
$IFS
空格和制表符,适用于这种情况。有关详细信息,请阅读这个百科全书式的答案。-r
两个示例中使用的选项传递给命令read
可防止反斜杠转义被解释。sed
根据第二个示例中的用法,读作这个答案。更多示例请参见答案的预览版本。