假设我创建一个文件~/myScript.sh
:
#!/bin/sh
for myVar; do
echo "Hi"
done
如果我bash myScript
不带参数执行,我将一无所获,但如果我使用一个或多个参数执行它,我将根据这些变量的数量获得输出(该变量似乎使脚本依赖于传递的参数):
bash ~/myScript.sh arg0 arg1
基于未定义变量的 for 循环myVar
将应用arg0
andarg1
到自身(抱歉,如果这个措辞很糟糕),我将得到以下输出:
你好
你好
(每个参数一个“嗨”)。
我最初假设一个for
循环适用于一个参数,所以如果我有myVar_0
andmyVar_1
与arg0
and arg1
,那么myVar_0
将与arg_0
and myVar_1
will work witharg1
但我进一步测试,我错了——所有for
循环都适用于所有参数:
#!/bin/sh
for myVar_0; do
echo "Hi"
done
for myVar_1; do
echo "Hello"
done
将返回bash myScript arg0 arg1
:
你好
你好
你好
你好
旁注:我假设如果想要“每 1 个 for 循环 1 个参数”,我只需要在本地范围内使用 Bash 函数。
我的问题
与 Bash 匹配的“所有 for 循环的所有参数”的名称是什么?
答案1
myVar
如果使用位置参数调用脚本,则不会未定义。来自 man bash:
对于名称 [ [ 在 [ 单词 ... ] ] ; ] 要做的事情清单; done
[...] 如果省略 in 字,则 for 命令对设置的每个位置参数执行一次 list
但你不使用$myVar
。
for myVar; do
echo "$myVar"
done
答案2
Bash / POSIX shell 中的循环for
类似于for
Python 中的循环:循环变量逐一采用列出的值,并且循环体针对每个值运行一次。
所以这:
for x in foo bar; do
echo "$x"
done
echo finally x is "$x"
类似于
x=foo # assign value
echo "$x" # loop body
x=bar # same with the second value...
echo "$x"
echo finally x is "$x" # this isn't part of the loop body
只是您不需要重复循环体。如果我们有一个数组变量A
,for x in "${A[@]}"; do...
则循环遍历数组的值。类似地for x in "$@"; do...
循环位置参数,即命令行参数,因为它们是"$@"
扩展的内容。基本上for x; do
只是简写for x in "$@"; do
因此,这将打印所有命令行参数:
对于 x;做 #或者:对于“$@”中的 x;做 printf "%s\n" "$x" 完毕
要通过索引直接访问参数,请使用$1
第一个参数、$2
第二个参数等...
printf "the first arg is %s and the second is %s\n" "$1" "$2"