gpt4 book ai didi

bash - 遍历 $@ 的值

转载 作者:行者123 更新时间:2023-11-29 09:37:46 25 4
gpt4 key购买 nike

我想遍历给 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com