2017-11-26 1 views
0

이것은 처음으로이 사이트를 사용하여 bash 스크립팅을 처음 접하기 시작했습니다. 필자는 스크립트 패키지를 작성하여 사용자가 설치하려는 소프트웨어 패키지 목록을 제공 한 다음 나중에 실제로 실행할 수있는 두 번째 스크립트 파일에 선택 사항을 출력하도록하고 있습니다. 지금까지 제 스크립트는 반 작동 중이지만 어떻게해야 하는지를 알아내는 데 도움이 필요합니다. A) 스크립트를 반복하면 스크립트가 반복되므로 스크립트가 다시 시작되고 스크립트를 종료하는 대신 다른 스크립트를 선택할 수 있습니다. B) 확인에 "아니오"또는 "nN"을 선택하면 선택 목록으로 돌아갑니다 wigging 대신 yes/no를 입력하면 유효한 입력을 묻는 메시지가 표시됩니다.bash 스크립트를 루핑

여기에 현재 스크립트가 있습니다. 아마도 끔찍하고 가장 비효율적 인 형식 일 수 있지만 처음에는 작은 학교에서만 사용하는 것으로 알고 있습니다. 내가하고있는 프로젝트. 어떤 도움을 주시면 감사하겠습니다.

#!/bin/bash 

#bash script to present list of packages for customer install output to txt 

if [[ ! -e /home/aarone/pkglist.txt ]]; then 
      echo "Making package list script" 
      echo "#!/bin/bash" > /home/aarone/pkglist 
      chmod -R 777 /home/aarone/pkglist 
fi 

# Declare variable choice and assign value 4 
choice=4 


# print to stdout 
    echo "1. Antivirus GUI" 
    echo "2. Firewall GUI" 
    echo "3. MariaDB" 
    echo -n "Please choose a A package [1,2 or 3]? " 
# Loop while the variable choice is equal 4 
# bash while loop 
while [ $choice -eq 4 ]; do 


#read user input 
read choice 

# bash nested if/else 
if [ $choice -eq 1 ] 
then 

     echo "You have chosen word: Antivirus GUI" 
     apt show clamtk 2>/dev/null | egrep '^Description|^Download' 
     read -r -p "Are you sure? [y/N] " response 
     if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
     then 
      echo "apt-get clamtk" >> pkglist 
     else 
      echo "Input not understood" 
      continue 
     fi 


else 

     if [ $choice -eq 2 ] ; then 

       echo "You have chosen package: Firewall GUI" 
       apt show gufw 2>/dev/null | egrep '^Description|^Download' 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get gufw" >> pkglist 
       else 
       read choice 

       fi 
     else 

       if [ $choice -eq 3 ] ; then 

       echo "You have chosen package: Office" 
       apt show libreoffice 2>/dev/null | egrep '^Description|^Download' 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get libreoffice" >> pkglist 
fi 

       else 
        echo "Please make a choice between 1-3 !" 
        echo "1. Antivirus GUI" 
        echo "2. Firewall GUI" 
        echo "3. Office application" 
        echo -n "Please choose a word [1,2 or 3]? " 
        choice=4 
       fi 
     fi 
fi 
done 

감사합니다. @janos는 내가 원했던 것입니다. :) 내가 바꾸고 싶은 유일한 다른 점은 스크립트가 (어떤 기본 설정보다) 생성 된 dir이므로 모든 시스템에서 사용할 수 있습니다. 또한 각 선택 항목에 작은 조정을 가해 "아니오"프롬프트가 이제 작동합니다.

1) 
      echo "You have chosen package: Antivirus GUI" 
      apt show clamtk 2>/dev/null | egrep '^Description|^Download' 
      while true; do 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get install -y clamtk" >> "$pkglist" 
        break 
       elif [[ "$response" =~ ^([nN][oO]|[nN])+$ ]] 
       then 
        echo "Cancelled" 
        break 
       else 
        echo "Input not understood" 
       fi 
      done 
      ;; 
+1

뭐든간에 *'chmod 777'은 잘못되어 위험합니다 *** 사용 사례에 필요한 사용 권한을 파악해야합니다. 그러나 실제로는 익명의 침입자를 포함하여 모든 사용자에게 파일에 대한 전체 쓰기 권한을 부여하는 것을 결코 포함하지 않습니다. – tripleee

+0

제발 제발 절대 사용하지 마십시오'chmod 777' – janos

답변

2

case 문은 메뉴의 구현을 단순화하는 데 많은 도움이 될 수 있습니다. 위의 제안을 적용

while true; do 
    # ... 
done 

하고 일부는 스크립트는 수정 될 수 있으며, 개선 : 단계를 반복

, 당신은 무한 루프를 사용할 수 있습니다 당신이

#!/bin/bash 

pkglist=/home/aarone/pkglist.txt 
if [[ ! -e "$pkglist" ]]; then 
    echo "Making package list script" 
    echo "#!/bin/bash" > "$pkglist" 
    chmod -R 777 "$pkglist" 
else 
    echo Package list script already exists. Exiting. 
    exit 1 
fi 

while true; do 
    echo "1. Antivirus GUI" 
    echo "2. Firewall GUI" 
    echo "3. MariaDB" 
    echo "x. Exit" 
    printf "Please choose a A package [1, 2 or 3]? " 
    read choice 

    case "$choice" in 
     1) 
      echo "You have chosen word: Antivirus GUI" 
      apt show clamtk 2>/dev/null | egrep '^Description|^Download' 
      while true; do 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get clamtk" >> "$pkglist" 
        break 
       else 
        echo "Input not understood" 
       fi 
      done 
      ;; 

     2) 
      echo "You have chosen package: Firewall GUI" 
      apt show gufw 2>/dev/null | egrep '^Description|^Download' 
      while true; do 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get gufw" >> "$pkglist" 
        break 
       else 
        echo "Input not understood" 
       fi 
      done 
      ;; 

     3) 
      echo "You have chosen package: Office" 
      apt show libreoffice 2>/dev/null | egrep '^Description|^Download' 
      while true; do 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get libreoffice" >> "$pkglist" 
        break 
       else 
        echo "Input not understood" 
       fi 
      done 
      ;; 

     *) 
      break 
    esac 
done 
관련 문제