我有这个脚本,旨在下载您作为参数给出的单词的发音:
#!/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 循环的脚本,它将正常工作,但我想同时下载许多文件
答案1
在任何类似 Bourne 的 shell 中,它是:
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 版标准之前,这并不是 POSIX,也不是 Bourne(尽管可以在大多数其他类似 Bourne 的 shell 中使用,bash
甚至包括 POSIX 模式)
或者比:
for arg in "$@"; do
printf 'Something with "%s"\n' "$arg"
done
这是 POSIX,但在不包含空格字符时在 Bourne shell 或 ksh88 中无法正常工作$IFS
,或者在没有参数时在某些版本的 Bourne shell 中无法正常工作,或者在没有参数时在某些 shell(包括某些版本的bash
)中无法正常工作参数并且该-u
选项已启用。
或者比
for arg do
printf 'Something with "%s"\n' "$arg"
done
这是 POSIX 和 Bourne,但不能在非常旧的基于 ash 的 shell 中工作。我个人会忽略这一点并自己使用该语法,因为我发现它是最清晰的,并且不希望我编写的任何代码最终都会被这样一个神秘的 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
答案2
我会用shift
.这[ -n "$1" ]
意味着当 arg-1 非空时,继续循环。
#! /bin/bash
while [ -n "$1" ]; do
echo "$1"
wget "https://ssl.gstatic.com/dictionary/static/sounds/de/0/$1.mp3"
shift
done
答案3
最简单的方法
#!/bin/bash
for i
do
echo $i
done
并运行
./a.sh personality brave selfish
这是标准输出上的打印内容
personality
brave
selfish