bash - 遍历 $@ 的值

标签 bash special-variables

我想遍历给 bash 脚本的参数,例如:

./bash_script file1 file2 file3

$@ 为我提供了所有提供给脚本的文件,但我如何遍历这些文件?

我想 cat 每个文件并使用 awk 删除内容(我知道该怎么做,它是 $@ 的解包> 这让我感到困惑)。

最佳答案

诀窍是双引号,如"$@"

foo(){
   printf ' ->%s\n' "$@";
}
foo "a b" c "d e"

相当于:

printf ' ->%s\n' "a b" c "d e"

如果上面的 $@ 不是双引号,那么你会得到:

 printf ' ->%s\n' a b c d e

由于 $IFS 字符的分词($IFS 默认为 ' '$'\t'$'\n',即一个空格、一个制表符和一个换行符)


$@ 与 $*

对于任何数组上的任何@-expansion,双引号都是这样工作的:

$ foo=( "a b" c "d e" )
$ printf ' ->%s\n' "${foo[@]}"
   ->a b
   ->c
   ->d e

相比之下,*-expansions(例如,$*${foo[*]})将使用第一个字符$IFS 将数组的项目连接成一个字符串:

$ foo=( "a b" c "d e" )
$ ( IFS=:; printf ' ->%s\n' "${foo[*]}" )
 ->a b:c:d e

如果不加引号,它将再次在这个 IFS 字符上拆分:

$ foo=( "a b" c "d e:f:g" )
$ ( IFS=:; printf ' ->%s\n' ${foo[*]} ) 
 ->a b
 ->c
 ->d e
 ->f
 ->g

在 for 循环中迭代 $@ 的技巧:

"$@" 数组比较特殊。如果你想在 for 循环中遍历 "$@",那么你可以缩写

 for variable_name in "$@"; do
   ...
 done

作为

 for variable_name; do 
 done

因为跳过 for 循环的 in something 部分意味着 in "$@"

这甚至在没有数组变量但支持 "$@""的 POSIX-only shell 中也有效(dash、bourne shell) $*.

关于bash - 遍历 $@ 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38065529/

相关文章:

linux - 将数千个文件从一个目录复制到另一个目录时出现 "Argument too long"错误

linux - bash 脚本语言使用循环打印数字列表

lisp - 一般来说, "lexical and special variable"语义是如何在幕后实现的?

ruby - __FILE__ == $PROGRAM_NAME 在 ruby​​ 中是什么意思?

perl - perl 中的动态变量

Perl 隐式关闭重置 $。多变的

linux - 尝试使用另一个作为源运行的脚本的源来运行 bash 脚本

python - 如何将每一行的第一列数据添加到相应行中由某些特定字符串或字符标记的每一列的标题?

bash 意外 token 然后错误

perl - Perl 中的美元插入符号零变量 ( $^0 ) 是什么?