Bash 스크립트 tput에서 오류가 발생했습니다. [닫기]

Bash 스크립트 tput에서 오류가 발생했습니다. [닫기]

이 입력 메뉴에 어떤 문제가 있는지 알아내야 합니다.

#!/bin/bash

tput setb 3
tput clear

function main_menu 
{
option=0
until [ "$option" = "4" ]; do
echo "  1.) Monitor existing processes "
echo "  2.) Copy passwd to /home directory "
echo "  3.) Ping local host "
echo "  4.) Exit "

echo -n "Enter choice:"
read option
echo ""
case $option in

    1 ) ps aux;echo "The list has been successfully generated!";
    2 ) cp /etc/passwd /home;echo "The passwd file has been copied to your home directory.";
    3 ) ping -c 4 127.0.0.1;echo "You have completed pinging localhost" );
    4 ) exit;; 
    * ) tput setf 4;echo "Please enter between number 1 and 4";tput setf 4;

esac
done
 }

If/Then 문에서 이 작업을 수행했는데 작동하지만 tput 사용법을 배우려고 합니다.

if/then (작동 중) #!/bin/bashclear echo "주 메뉴" echo "1. 기존 프로세스 모니터링" echo "2. /home 디렉토리에 비밀번호 복사" echo "3. 로컬 호스트 핑" echo "4 .exit"

read num 

if [ $num -eq 1 ]   
then ps aux
        echo "The list has been successfully generated! "

elif [ "$num" -eq 2 ]
then cp /etc/passwd /home
        echo "The passwd file has been copied to your home directory."

elif [ "$num" -eq 3 ]
then ping -c 4 127.0.0.1
        echo "You have completed pinging localhost"

elif [ "$num" -eq 4 ]
then clear

fi

답변1

#!/bin/bash

tput setb 3         # if you set these inside the loop, you won't have to mess with color as much later on.
tput clear

function main_menu     # this can be done a better way. slightly incorrect syntax as-is. also, you define main_menu but never call the function.
{
option=0       # not neded
until [ "$option" = "4" ]; do    # quotes not needed
echo "  1.) Monitor existing processes "       # this can all be cleaned up
echo "  2.) Copy passwd to /home directory "
echo "  3.) Ping local host "
echo "  4.) Exit "

echo -n "Enter choice:"
read option    # the echo prompt and read can be shortened with read -p
echo ""        # quotes not needed
case $option in

    1 ) ps aux;echo "The list has been successfully generated!";     # all of the case entries need to end in double semi-colons
    2 ) cp /etc/passwd /home;echo "The passwd file has been copied to your home directory.";
    3 ) ping -c 4 127.0.0.1;echo "You have completed pinging localhost" );   # there is an unnecessary ")" here 
    4 ) exit;; 
    * ) tput setf 4;echo "Please enter between number 1 and 4";tput setf 4;   # I think you might be trying to set the warning red, but both of your tput commands set color to red.
esac
done
 }

나는 이 작업을 수행하는 유사하고 실용적인 방법을 제공했습니다(일부 다른 색상 사용).

#!/bin/bash

tput clear

main_menu()
{
until [ $option = 4 ]; do
tput setb 2
tput setf 5
read -p "  
1.) Monitor existing processes
2.) Copy /etc/passwd to /home directory
3.) Ping local host
4.) Exit
Enter choice: " option
echo 
case $option in

    1) ps aux;echo "The list has been successfully generated!";;
    2) cp /etc/passwd /home;echo "The passwd file has been copied to your home directory.";;
    3) ping -c 4 127.0.0.1;echo "You have completed pinging localhost" ;;
    4) exit;; 
    *) tput setf 4; echo "Please enter between number 1 and 4\n\n";;

esac
done
}

main_menu

세 가지 주요 질문:

  • 함수 구문이 약간 벗어났습니다. 가지다세 가지 방법함수를 선언하려면 제가 보여드린 방식이 가장 깔끔하고 간단한 방식인 것 같습니다.
  • 매우 중요;;Case 문의 줄 끝에서
  • 그리고 루프 내부에는 기본 색상이 없습니다. 이렇게 하면 스크립트가 손상되지는 않지만 잘못된 텍스트로 수행하려는 작업이 더 쉬워집니다.

답변2

먼저 기본 코드에서 몇 가지 사소한 오류를 수정해야 합니다.

  • 모든 사례 설명을 종료해야 합니다.세미콜론;;
  • 옵션 3에는 끝에 제거해야 하는 불필요한 브래킷이 있습니다.
  • 표시된 것처럼 전체 스크립트는 main_menu 함수에 정의되어 있지만 함수는 호출되지 않습니다. 텍스트만 포함하는 별도의 줄을 추가하세요.메인 메뉴함수의 코드를 실행합니다.

tput color 문이 작동하지 않으면 setab 및 set setaf를 사용해 보십시오. 차이점은 setb와 setf는 8가지 색상만 지원하는 반면, setab과 setaf는 256가지 색상을 지원한다는 것입니다. 터미널에 따라 이러한 변경 사항은 컴패니언 터미널에서 잘 작동했습니다.

관련 정보