web-dev-qa-db-ja.com

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ループなしでスクリプトを作成すると、正しく機能しますが、同時に多くのファイルをダウンロードしたい

16
AmirrezaFiroozi

ボーンのようなシェルでは、それは:

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ではありませんでした(ただし、POSIXモードでもbashを含む他のほとんどのBourneのようなシェルで動作します)

または:

for arg in "$@"; do
  printf 'Something with "%s"\n' "$arg"
done

これはPOSIXですが、$IFSにスペース文字が含まれていない場合、または引数がない場合のBourne Shellの一部のバージョン、または一部のシェル(一部のバージョンを含む)では、Bourne Shellまたはksh88で正しく機能しません。 of bash)引数がなく、-uオプションが有効になっている場合。

またはより

for arg do
  printf 'Something with "%s"\n' "$arg"
done

これはPOSIXとBourneですが、非常に古いashベースのシェルでは機能しません。私は個人的にはそれを無視し、自分でその構文を使用します。なぜなら、それが最も読みやすく、自分が書いたコードがそのような難解なシェルによって解釈されることになるとは思わないからです。

詳細:


$i[1..$#]をループして対応する要素にアクセスする場合は、次のようにします。

任意のPOSIXシェル:

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}は、間接変数展開です。つまり、izshパラメータ展開フラグと同様に、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
37

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
hschou

最も簡単な方法

#!/bin/bash
for i
do
 echo $i
done

そして走る

./a.sh personality brave selfish

これが標準出力のプリントです

personality
brave
selfish
0
Karthik Marri