作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想遍历给 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/
我是一名优秀的程序员,十分优秀!