如何在 for 循环中使用 $1 $2 ... 等参数?

如何在 for 循环中使用 $1 $2 ... 等参数?

我有这个脚本,旨在下载您作为参数给出的单词的发音:

#!/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,类似于zshP参数扩展标志:

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

相关内容