これは潜在的に愚かな質問または不可能な要求です。とにかく、インストールされているソフトウェアのリストから選択したプログラムを起動するための小さなスクリプトを書いています。基本的には、私のスクリプトは、プログラムがアルファベット順にリストされた番号付きのリストを提示し、私は打ちたいプログラムに対応する番号を入力します。私の選択肢が格納されている変数はcase
に送られ、対応するソフトウェアが起動され、それぞれのコマンドリストにその場所が格納されます。ご覧のとおりその変数をオートインクリメントするシーケンシャルケース
i=1
echo -e "Which program to launch?\n"$((i++))". Program 1\n"$((i++))". Program 2\n"
read choice
case $choice in
1) path to program 1
2) path to program 2
esac
は、echo
に私は新しいプログラムがリストされるたびに増分されます変数を使用しました。これは、手動で静的な数字を書くことを避けるために、新しいプログラムがインストールされるたびに個人的に移動しなければならず、既存の2つのプログラムの間にリストに挿入する必要があります。私がする必要があるのは、ユニバーサル$((i++))
インデックスをコピーするだけです。リストはそれ自身で調整されます。
問題は私がcase
サイクルでこれを実装する方法を知らないことです。私はアルファベット順に2つの既存のものの間に置く必要があるプログラム3をインストールすると仮定すると、echo
はこのよう
echo -e "Which program to launch?\n"$((i++))". Program 1\n"$((i++))". Program 3\n"$((i++))". Program 2\n"
変更されます。しかしcase
に、私は手動で3)
に、第2のプログラムの前に2)
を変更する必要があります。
case $choice in
1) path to program 1
2) path to program 3
3) path to program 2
esac
これは彼の例では問題ではないかもしれないが、それは私がプログラムの数十を持っている、と私は6に5を変更する必要があり、7への6などよりなるまでということになりました20.
case
の番号を自動化することで、サイクルが変数値がnの場合にn番目のケースを実行する必要があることを理解することができますか?
このようにして、それぞれの選択肢ごとに完全に別々のコマンドを与えることができますか?あるいは、別のコマンドを作るために変数 '$ choice'自体に依存する必要がありますか? –
@JeffreyLebowski:アップデートを確認してください。 – choroba
更新に関する1つのコメント:連想配列に1つのコマンド* name *より複雑なものを格納しようとしないでください。より複雑なものは、名前を配列に格納できる関数にラップする必要があります。 – chepner