我有一个包含多行的文本文件。我使用 while 命令逐行读取文件,但我需要将值存储在单独的变量中,并在尾随 shell 脚本中使用它们。
这切命令分隔整个文件而不是读取的行。
例子my_file.txt
:
d1:jobid1
id2:jobid2
我正在使用下面的 while 循环逐行读取文件
while IFS= read -r line; do
jobid=`cut -d: -f2`
id=`cut -d: -f1`
#remaining shell-script dependent upon variables#
done < my_file.txt
我想存储每一行的 jobid 和 idmy_file.txt
并运行尾随脚本。每行都是新行
需要帮助以递归方式存储变量中的值。如果有更好的方法来逐行读取并分别分隔和存储两个字段。
答案1
cut
默认从标准输入读取。在命令替换中,标准输入继承自循环的标准输入(因为您没有为 的调用提供其他显式输入cut
)。循环的标准输入来自您的输入文件。
结果是文件的第一行由 读取read
,而所有其他行由第一次调用 读取cut
。因此,变量中的值jobid
将是换行分隔的作业 ID 字符串,而id
变量将为空。该循环将仅运行一次迭代。
你可以用, 例如,
id=$( printf '%s\n' "$line" | cut -d: -f1 )
# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")
但这是不必要的,因为这样做会更干净、更有效
while IFS=: read -r id jobid; do
# code that uses "$id" and "$jobid" goes here
done <my_file.txt
read
这利用了可以一次将一行输入的数据读取到多个变量中的事实。通过设置IFS
为冒号,该行在冒号上分割,第一个字段被读入,id
而其余字段被读入jobid
。cut
根本不需要打电话。