以下はこのように実行するとメニューが出るスクリプトですが./menu.sh
、実行すると以下のようになります。./menu.sh | bash
見つからないコマンドがたくさん表示されます。
私がこのプログラムを実行したいのは、| bash
それがFTPサーバーにあり、別のリモート場所で実行する必要があるためです。だから私は単にcurl -s
ftp用にし、使用しなければコードだけを| bash
印刷します。cat
#!/bin/bash
#$path=./
while :
do
echo " "
echo " "
echo "===== MAIN - MENU ====="
echo "1. Run old sanity script"
echo "2. Asterisk"
echo "3. Audio"
echo "4. CoCo"
echo "5. Database"
echo "6. Mobile"
echo "7. SSH"
echo "8. Touch"
echo "9. VDS"
echo "10. Wireshark"
echo -----------------------
echo "q. Quit"
echo "r. Reload"
echo "======================="
echo -n "Please enter your choice: "
read opt;
echo " "
echo " "
case $opt in
1) curl -s sanity_check.sh | bash;;
2) exec ./menu/asterisk/menu.sh;;
3) exec ./menu/audio/menu.sh;;
4) exec ./menu/coco/menu.sh;;
5) exec ./menu/database/menu.sh;;
6) exec ./menu/mobile/menu.sh;;
7) exec ./menu/ssh/menu.sh;;
8) exec ./menu/touch/menu.sh;;
9) exec ./menu/vds/menu.sh;;
10) exec ./menu/wireshark/menu.sh;;
q) echo " "
echo "Bye Bye";
exit 1;;
Q) echo " "
echo "Bye Bye";
exit 1;;
r) exec ./menu.sh;;
R) exec ./menu.sh;;
*) echo "$opt is an invaild option.";
echo "Press [enter] key to continue. . .";
read enterKey;;
esac
done
それは私に次のエラーを与えます:
bash: line 3: =====: command not found
bash: line 4: 1.: command not found
bash: line 5: 2.: command not found
bash: line 6: 3.: command not found
bash: line 7: 4.: command not found
bash: line 8: 5.: command not found
bash: line 9: 6.: command not found
bash: line 10: 7.: command not found
bash: line 11: 8.: command not found
bash: line 12: 9.: command not found
bash: line 13: 10.: command not found
bash: line 14: -----------------------: command not found
bash: line 15: q.: command not found
bash: line 16: r.: command not found
bash: line 17: =======================: command not found
しかし、私にとってこれはただのエコー命令です...それとも私が何かを見逃しているのでしょうか?
答え1
このコードを実行すると、テキストメニューが出力されます。あなたがやっていることは、./menu.sh | bash
メニューをbash
実行に入力することです。つまり、bash
「このメニューを実行してください」という意味です。 bash
メニュー内のテキストの意味がわからないため、エラーが発生します。
ただし、このスクリプトを使用する方法はありません。あなたはそれを(出力ではなくスクリプト)インポートして実行しようとします:
curl -o- 'ftp://.../menu.sh' | bash
これはパイプの左側にあるスクリプトを実行しませんが、ユーザーは./menu.sh | bash
実行します。だからあなたが提案したことがうまくいくかもしれません。
また、ここでドキュメントを使用すると、複数行の出力が少し簡単になります。
cat <<END_MENU
===== MAIN - MENU =====
1. Run old sanity script
2. Asterisk
3. Audio
4. CoCo
5. Database
6. Mobile
7. SSH
8. Touch
9. VDS
10. Wireshark
-----------------------
q. Quit
r. Reload
=======================
END_MENU
この声明も調査select
中ですbash
。メニューを表示し、ユーザー入力を簡単にします(もちろん、メニューとオプションの特別な形式を望まない限り)。
case
ステートメントで複数のパターンを実行することもできます。
q|Q) echo 'Bye!'
exit ;;
または
[qQ]) echo 'Bye!'
exit ;;
(exit
しかし、ユーザーの要求がゼロ以外の終了コードを返すべきではないので)
答え2
スクリプトの出力をbashに送信しています。 bashが実行できるようにスクリプトテキストをbashに送信したくないですか?
cat menu.sh | bash