使用分隔符分割线并将两个字段存储在不同的变量中

Uba*_*yas 2 shell-script cut

我有一个包含多行的文本文件。我正在使用 while 命令逐行读取文件,但我需要将值存储在单独的变量中并在尾随 shell 脚本中使用它们。

命令限定了完整的文件不读线。

示例my_file.txt

d1:jobid1
id2:jobid2
Run Code Online (Sandbox Code Playgroud)

我正在使用下面的 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
Run Code Online (Sandbox Code Playgroud)

我想存储每一行​​的 jobid 和 idmy_file.txt并运行尾随脚本。每行都在一个新行中

需要帮助以递归方式将值存储在变量中。如果有更好的方法来逐行读取并分别分隔和存储两个字段。

Kus*_*nda 6

cut默认情况下从标准输入读取。在您的命令替换中,标准输入是从循环的标准输入继承的(因为您没有为对 的调用提供其他显式输入cut)。循环的标准输入来自您的输入文件。

结果是文件的第一行由 读取read,而所有其他行由第一次调用读取cutjobid因此,变量中的值将是一个以换行符分隔的作业 ID 字符串,而id变量将为空。该循环将仅运行一次迭代。

例如,您可以使用

id=$( printf '%s\n' "$line" | cut -d: -f1 )

# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")
Run Code Online (Sandbox Code Playgroud)

但这将是不必要的,因为这样做会更清洁、更高效

id=$( printf '%s\n' "$line" | cut -d: -f1 )

# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")
Run Code Online (Sandbox Code Playgroud)

这利用了read可以一次将一行输入中的数据读取到多个变量中的事实。通过设置IFS为冒号,该行在冒号处被拆分,第一个字段被读入,id而其余字段被读入jobid. 根本没有必要打电话cut