Bash:每个未定义变量一个参数

Bash:每个未定义变量一个参数

假设我创建一个文件~/myScript.sh

#!/bin/sh

for myVar; do
    echo "Hi"
done

如果我bash myScript不带参数执行,我将一无所获,但如果我使用一个或多个参数执行它,我将根据这些变量的数量获得输出(该变量似乎使脚本依赖于传递的参数)

bash ~/myScript.sh arg0 arg1

基于未定义变量的 for 循环myVar将应用arg0andarg1到自身(抱歉,如果这个措辞很糟糕),我将得到以下输出:

你好

你好

(每个参数一个“嗨”)。


我最初假设一个for循环适用于一个参数,所以如果我有myVar_0andmyVar_1arg0and arg1,那么myVar_0将与arg_0and myVar_1will 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类似于forPython 中的循环:循环变量逐一采用列出的值,并且循环体针对每个值运行一次。

所以这:

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

只是您不需要重复循环体。如果我们有一个数组变量Afor 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"

相关内容