私はあなたがそれを引数として与える単語の発音をダウンロードするように設計されたこのスクリプトを持っています:
#!/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ではありませんでした(ただし、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}
は、間接変数展開です。つまり、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
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
最も簡単な方法
#!/bin/bash
for i
do
echo $i
done
そして走る
./a.sh personality brave selfish
これが標準出力のプリントです
personality
brave
selfish