我有这个脚本,旨在下载您作为参数输入的单词的发音:
#!/bin/bash
m=$#
for ((i=1;i<=m;i++));do
echo $i
#wget https://ssl.gstatic.com/dictionary/static/sounds/de/0/"$i".mp3
done
如果我通过此命令运行它
./a.sh personality brave selfish
它应该在标准输出上打印
personality
brave
selfish
但是它打印
1
2
3
您能帮我解决这个问题吗?
ps:例如,如果我编写的脚本没有带$ 1的for循环,它将可以正常工作,但是我想同时下载许多文件
在任何类似伯恩的外壳中,它是:
for arg
do printf 'Something with "%s"\n' "$arg"
done
也就是说,默认情况下会for
在位置参数($1
,$2
...)上循环(如果您不提供in ...
零件的话)。
请注意,它比:
for arg; do
printf 'Something with "%s"\n' "$arg"
done
直到2016年版标准和Bourne才使用POSIX(尽管可以在大多数其他类似Bourne的shell中使用,bash
即使在POSIX模式下也可以使用)
或比:
for arg in "$@"; do
printf 'Something with "%s"\n' "$arg"
done
这是POSIX,但是在$IFS
不包含空格字符的情况下在Bourne shell或ksh88中无法正常工作,或者在没有参数的情况下在Bourne shell的某些版本中无法运行,或者在不包含空格的情况下在某些shell(包括的某些版本bash
)中无法正常运行参数,并且该-u
选项已启用。
或比
for arg do
printf 'Something with "%s"\n' "$arg"
done
这是POSIX和Bourne,但不能在非常旧的基于灰的shell中使用。我个人忽略了这一点,而是自己使用了该语法,因为我发现它是最易读的,并且不希望我编写的任何代码最终都会被这种神秘的外壳解释。
有关更多信息,请访问:
现在,如果您确实想$i
循环[1..$#]
访问相应的元素,则可以执行以下操作:
在任何POSIX Shell中:
i=1
for arg do
printf '%s\n' "Arg $i: $arg"
i=$((i + 1))
done
或者:
i=1
while [ "$i" -le "$#" ]; do
eval "arg=\${$i}"
printf '%s\n' "Arg $i: $arg"
i=$((i + 1))
done
或搭配 bash
for ((i = 1; i <= $#; i++ )); do
printf '%s\n' "Arg $i: ${!i}"
done
${!i}
是间接变量扩展,扩展为名称存储在i
变量中的参数的内容,类似于zsh
的P
参数扩展标志:
for ((i = 1; i <= $#; i++ )); do
printf '%s\n' "Arg $i: ${(P)i}"
done
尽管在中zsh
,您还可以通过$argv
数组访问位置参数(如中的csh
):
for ((i = 1; i <= $#; i++ )); do
printf '%s\n' "Arg $i: $argv[i]"
done
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句