私はシェルプログラミングに初めて触れました。私の目標は、ユーザーが実行するファイルを選択できるようにすることです。次のコマンドを使用して、varで使用可能なすべてのスクリプトをキャプチャします。
var=$(find script*)
これまではとてもよかったです。結果は次のとおりです。
echo $var
script1 script2 script3 scr...
今度は、各ファイルを変数に保存して後で選択したときに実行したいと思います。
select SEL in script1 script2 script3 ..........
case $SEL in
$Script1) echo ($Script1 will start) && ./$script1 ;;
$Script2) echo ($Script2 will start) && ./$script2 ;;
$Script3) echo ($Script3 will start) && ./$script3 ;;
$Sc..) echo ($Scr.... will start) && ./$scrip.... ;;
$Sc...) echo ($Sc...... will start) && ./$scrip..... ;;
*) echo "choose on of the availabel files";;
esac
done
各ファイルの数と正確な長さがわからない場合は、どのファイルをどのように分割するのかわかりません。
echo ${var[1]} と echo $var[1] に分割しようとしましたが、動作しません。空の出力または完全な文字列を受け取りました。
答え1
最初の行:
var=$(find script*)
var
すべてを含む文字列変数を作成するだけですscript*
。それいいえ配列なので、[]
必要に応じてインデックスを作成することはできません。
実際にはscript*
シェルによって拡張されるので、そこfind
では何もしません(ディレクトリではない限り、そうは見えません)。すべてのファイル名を引数として取得し、ファイル名が存在することを確認してから直接印刷します。そしてまた出ます。シェルは実際にすべての操作を行います。
代わりに、私たちは大量に、私達はシェルを使用できますグローバル拡張自分で入力してください。
files=(script*)
初期化プログラム(右側)を括弧内に入れると、複数の=
値を個別に保持する配列が生成されます。現在のディレクトリから始まるすべてのファイル名script*
に展開されます。script
ファイル名にスペースが含まれている場合、配列$()
イニシャライザ(バックティックまたは)内のコマンドのように単語は分割されません。
この時点で一部のユーザー入力を読むことができます。
select SEL in "${files[@]}"
do
if ! [ "$SEL" ]
then
echo "Choose one of the available files."
continue
fi
echo "$SEL will start"
"./$SEL"
break
done
ユーザーにファイル選択を提供するため"${files[@]}"
に、完全なファイル名の配列をきちんと拡張するように作成し、対応するブロックを入力します。select
do...done
空の場合、$SEL
ユーザーは存在しない項目を選択したので、プロンプトを印刷してcontinue
再選択を要求します。
それ以外の場合は、echo
スクリプトが起動して実行されることを知らせます。"./$SEL"
スクリプト名にスペースが含まれないようにするために、この名前を引用してください。これにより、コマンド名が./firstword
引数として残りの単語として扱われます。break
私たちが戻ってユーザーに再び尋ねることを防ぎます。そのためには、単に取り出してください。
あなたの使用はcase...of
あなたが提供した例に大きな影響を与えないようですが、選択したスクリプトに応じて別の動作がある場合(そしてこれdo...done
スクリプト)ブロック内に入れることができます。
答え2
100%確信はありませんが、var = $(find script *)とケースをよりよく使うことができるのではなく、これが良いかもしれません。
for i in `find script*`
do
echo ($i will start)
./$i
done