これはスクリプトです。
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
つまり、インデックスを繰り返す代わりにパラメータを繰り返し、インデックスを個別に増やします。
アプローチに関するいくつかの注意:
リストコンテキストで引用符なしのパラメータ拡張を維持することは非常に特別な意味を持ちます。あなたはほとんどそうしたくありません。。
`...`
これで、コマンドの代替形式を避ける必要があります。代わりに使用してください$(...)
。引用符なしでコマンドを置き換えると、分割+グローブも呼び出されますので、注意して使用してください。ここで使用しています分ける部分は依存する現在の値を意味します
$IFS
。の出力にはseq
ワイルドカードが含まれていないため、問題は発生しません。全体的な状況部分。seq
標準コマンドではなく、すべてのシステムで見つかりません。数字を繰り返すことはとにかく最善の方法ではありません。完全な出力をメモリに保存して分割することを意味するため(メモリに追加のコピーが作成されます)、これはシェルが組み込まれていても次のことを実行することでサポートされます。プロセス内の別々のユーティリティ。she-bang(最初の行)を入れないと、POSIXシェル(以前のシステムではBourne(POSIXではなく)シェルである可能性があります)
#! /path/to/interpreter -
によって解釈されるという唯一の保証があるので、次のものが必要です。sh
構文がPOSIX規格に準拠していることを確認してください。sh
が提供するシステムでも、実行時にすべてのbash
拡張が有効になるわけではありません。bash
sh
上記のコードは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