如何使用从列表中获取的变量输入文件-bash

时间:2018-08-28 13:02:54

标签: bash

让我们说我有一个文件myfile.csv。在此文件中,我有一个像这样的列表:

black
white
grey
orange
red

我希望任何行都将是一个变量,并使用该名称将该变量输入到目录中。

示例:

for i in $( myfile.csv ); do
    cd /directory/$i && cat anotherfile.txt

它不起作用。我会很高兴为您提供帮助。:)

2 个答案:

答案 0 :(得分:2)

您无需输入目录即可保存所包含的文件。遍历文件的所有行是whileread的工作:

while IFS= read -r dir; do
   if [[ -f "$dir/anotherfile.txt" ]]; then
       cat "$dir/anotherfile.txt"
   else
       printf 'WARNING: %s not found\n' "$dir/anotherfile.txt"
   fi
done < myfile.csv

当然,仅当您的myfile.csv文件每行具有一个目录名称时,此方法才有效...

答案 1 :(得分:2)

在shell脚本中,通常可以通过巧妙地使用可用命令来避免显式循环。大多数命令(包括cat)都接受多个文件名。而且,如果您想在文件的每一行上运行命令,请考虑使用xargs

xargs -a myfile.csv -d '\n' -I {} cat /directory/{}/anotherfile.txt

这将对cat /directory/{}/anotherfile.txt的每一行运行myfile.csv,其中花括号用输入行替换。

来自xargs(1) man page

  
      
  • --delimiter=delim, -d delim

         

    输入项目以指定字符终止。指定的分隔符可以是单个字符,C型字符转义符(例如\n或八进制或十六进制的转义码。)

  •   
  • -a file, --arg-file=file

         

    从文件而不是标准输入中读取项目。如果你用这个   选项,运行命令时标准输入保持不变。除此以外,   从/dev/null重定向标准输入。

  •   
  • -I replace-str

         

    用初始参数替换 replace-str 的出现   名称从标准输入中读取。另外,未引用的空白不   终止输入项;相反,分隔符是换行符。   表示-x-L 1

  •