注意:当每个文件逐行包含 1 个单词时,这将很简单。
如果您打算在源文件中使用空格,则可以使用另一个分隔符:
while IFS=@ read -r aws_user_name aws_key aws_account_num ;do
printf "User: %-16s Key: %-22s AccNum: %s\n" \
"$aws_user_name" "$aws_key" "$aws_account_num"
# ....
done < <(
paste -d@ "$aws_users_all" "$aws_env_list" "$aws_account_numbers"
)
我不确定是IFS=@
paste -d@
什么意思?我明白了paste -d "|,"
,我也能弄清楚 IFS=";"意思是。我也关注https://stackoverflow.com/questions/7427262/how-to-read-a-file-into-a-variable-in-shell
https://man7.org/linux/man-pages/man1/bash.1.html
答案1
FWIW,更多的是作为评论而不是答案(已经被由@roaima 提供),这样写会更有意义:
while
IFS= read -r aws_user_name <&3 &&
IFS= read -r aws_key <&4 &&
IFS= read -r aws_account_num <&5
do
printf "User: %-16s Key: %-22s AccNum: %s\n" \
"$aws_user_name" "$aws_key" "$aws_account_num"
# ....
done 3< "$aws_users_all" 4< "$aws_env_list" 5< "$aws_account_numbers"
而不是加入 ,@
稍后再在 上拆分@
。
这样,具有@
in 值就不会导致问题,并且可以正确检测到 3 个列表中缺失的元素。它还避免了<(...)
kshism,使其成为标准sh
代码。
awk
如果循环所做的只是打印内容,那么使用/perl
或某些适当的文本处理实用程序甚至比在这样的循环中多次调用一些笨重的工具更有意义。更多相关信息,请访问为什么使用 shell 循环处理文本被认为是不好的做法?
答案2
既然您理解了,paste -d "|,"
那么您还可以推断出含义paste -d@
- 这是相同的过程 - 而不是用 分隔|,
字段@
。 (与许多 UNIX/Linux 工具一样,标志及其参数可以连接在一起或用空格分隔;标准解析库不关心 - 请参阅POSIX 实用程序参数语法,第 2a 点。)
在这种情况下,IFS
变量决定动词解析其输入的方式read
。变量aws_user_name
、aws_key
和aws_account_num
是从 的输出中读取的,并在刚刚添加的符号paste -d@
处拆分。@
paste
您可以部分剖析该命令以查看发生了什么;运行paste
命令(使用三个变量的适当文件名)将显示循环while read …
将要处理的内容
paste -d@ "$aws_users_all" "$aws_env_list" "$aws_account_numbers"
请注意,如果任何源值包含分隔符 ( @
),这种处理将会中断。