아래는 이렇게 실행하면 메뉴가 나오는 스크립트인데 ./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
그런데 사용자의 요청이 0이 아닌 종료 코드를 반환해서는 안 되기 때문에)
답변2
스크립트의 출력을 bash로 보내고 있습니다. bash가 실행할 수 있도록 스크립트 텍스트를 bash로 보내고 싶지 않으십니까?
cat menu.sh | bash