forループのパラメータ値の印刷

forループのパラメータ値の印刷

これはスクリプトです。

user@linux:~$ cat script.sh 
#!/bin/bash
for i in `seq $#`
do
  echo $i
done
user@linux:~$ 

出力

user@linux:~$ ./script.sh a b c
1
2
3
user@linux:~$ 

希望の出力

数値だけでなく...これらのパラメータ値を取得したいと思います。

user@linux:~$ ./script.sh a b c
1 - a
2 - b
3 - c
user@linux:~$ 

答え1

#! /bin/sh -
i=1
for arg do
  printf '%2d: %s\n' "$i" "$arg"
  i=$((i + 1))
done

つまり、インデックスを繰り返す代わりにパラメータを繰り返し、インデックスを個別に増やします。

アプローチに関するいくつかの注意:

  • リストコンテキストで引用符なしのパラメータ拡張を維持することは非常に特別な意味を持ちます。あなたはほとんどそうしたくありません。

  • echo任意のデータの出力には使用できません。

  • `...`これで、コマンドの代替形式を避ける必要があります。代わりに使用してください$(...)

  • 引用符なしでコマンドを置き換えると、分割+グローブも呼び出されますので、注意して使用してください。ここで使用しています分ける部分は依存する現在の値を意味します$IFS。の出力にはseqワイルドカードが含まれていないため、問題は発生しません。全体的な状況部分。

  • seq標準コマンドではなく、すべてのシステムで見つかりません。数字を繰り返すことはとにかく最善の方法ではありません。完全な出力をメモリに保存して分割することを意味するため(メモリに追加のコピーが作成されます)、これはシェルが組み込まれていても次のことを実行することでサポートされます。プロセス内の別々のユーティリティ。

  • she-bang(最初の行)を入れないと、POSIXシェル(以前のシステムではBourne(POSIXではなく)シェルである可能性があります)#! /path/to/interpreter -によって解釈されるという唯一の保証があるので、次のものが必要です。sh構文がPOSIX規格に準拠していることを確認してください。shが提供するシステムでも、実行時にすべてのbash拡張が有効になるわけではありません。bashsh

    上記のコードはPOSIXと互換性がありますが(.NETでも動作しますbash)、Bourneと互換性はありません($((...))Bourneシェルでは算術拡張構文を使用できないため)。 Solaris 10以前では、#! /usr/xpg4/bin/sh -(ほとんどの場合)POSIX準拠のインタープリタを取得するには、she-bangをに変更する必要があります。

答え2

#!/bin/bash
for ((i=1; i<=$#; i++))
do
  echo "$i - ${!i}"
done

関連情報