Bash-在迭代变量时循环命令?

我是 BASH 的新手,我有点迷茫。我也不确定我的特定问题之前是否已解决(如果已解决,我深表歉意)。

我有一个带有 3 列表的 csv 文件。我想运行一个循环,该循环将重复某个命令,并在完成后重新运行我的命令并从我的变量提取的表中插入下一个值。我希望重复这个过程,直到从表的每一列中提取每个值(我的命令一次提取三个)。

这是我到目前为止所拥有的:

file=$(cat /path/my_ids.csv | awk -v FS=',' '{ print $1}'| head -1 | tail -n 1 )
id1=$(cat /path/my_ids.csv | awk -v FS=',' '{ print $2}'| head -1 | tail -n 2 )
id2=$(cat /path/my_ids.csv | awk -v FS=',' '{ print $3}'| head -1 | tail -n 3 )

这些是我用来从表 (my_ids.csv) 中各自列调用值的变量。每次运行循环时,我的命令都需要一次从三个不同的列中提取三个值。一旦循环准备好,我的命令应该看起来像这样 - 我对原始命令所做的只是包括星号之间的内容:

command -base **$file** -tp **$id1** -tp **$id2** -all

(该命令从一个特定的程序运行,该程序将创建一个新目录(文件),同时平均其他两个 id 目录。这就是为什么我需要一个循环,每次循环时都会遍历每个变量列中的下一个值。)

如何让 bash 重复该命令并在每次循环发生时向下移动三列值?

感谢您的帮助和耐心!

回答

逐行逐行读取文件并执行命令。

{ 
   # ignore first line
   IFS= read -r _
   # read each line and split on ,
   while IFS=, read -r file id1 id2; do
     # execute the command
     command -base "$file" -tp "$id1" -tp "$id2" -all
   done
} < my_ids.csv

阅读https://mywiki.wooledge.org/BashFAQ/001。使用https://shellcheck.net检查您的脚本。

  • 这绝对是正确的做法。一个潜在的警告是,您需要确保 `command` 不会尝试从 stdin 读取,因为如果这样做,它将消耗用于 `while read` 的数据。执行 `command &lt;&amp;- -base ...` 来防止这种情况可能更安全,或者为 `read` 使用不同的文件描述符。

以上是Bash-在迭代变量时循环命令?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>