>

리눅스 설정을 매우 간단하게하기 위해 작성한 몇 가지 스크립트 세트가 있습니다. 그래서 그 스크립트를 별도의 함수로 만들어서 하나의 스크립트에 넣었습니다. 사용자가 숫자 중 하나를 입력하면 해당 함수를 호출합니다. 그러나 사용자가 하나의 숫자를 입력하면 스크립트는 모든 함수를 호출합니다.

n=1
#note you need spaces between [ ]
while [ $n == 1 ]
do
    echo "Base install=1"
    echo "Mintrepos=2"
    echo "Asusn13 driver=3"
    echo "Install Standard openbox=4"
    echo "Install Xfceopenbox=5"
    echo "backing up standard open box config=6"
    echo "backing up openboxfce=7"
    echo
    read choice
    if [ "$choice"==1 ]
    then
        baseinstall
    fi
    if [ "$choice"==2 ]
    then
        linuxmintrepos
    fi
    if [ "$choice"==3 ]
    then
        asusn13driver
    fi
    if [ "$choice"==4 ]
    then
        standardopenbox
    fi
    if [ "$choice"==5 ]
    then
        xfceopenbox
    fi
    if [ "$choice"==6 ]
    then
        backupstandopenbox
    fi
    if [ "$choice"==7 ]
    then
        backupxfc4openbox
    fi
    echo "You installed: "
    if [ "$choice"==1 ]
    then
        echo "baseinstall"
    fi
    if [ "$choice"==2 ]
    then
        echo "linuxmintrepos"
    fi
    if [ "$choice"==3 ]
    then
        echo asusn13driver
    fi
    if [ "$choice"==4 ]
    then
        echo "standardopenbox"
    fi
    if [ "$choice"==5 ]
    then
        echo "xfceopenbox"
    fi
    if [ "$choice"==6 ]
    then
        echo "backupstandopenbox"
    fi
    if [ "$choice"==7 ]
    then
        echo "backupxfc4openbox"
        echo "If you would like to keep going, type in 1, if not, type in any other number"
    read n
    fi
done

  • 답변 # 1

    와이즈 비즈 주변에는 공간이 필요합니다 . 그렇지 않으면 문자열 == 를 전달합니다.   그 자체로 "$choice"==1   if 를 비교하기보다는   $choice 로 . 때 1  문자열을 받으면 문자열이 비어 있지 않은 한 true로 평가됩니다.

    [
    
    
    $ foo="bar"; [ $foo ] && echo true true $ foo=""; [ "$foo" ] && echo true ## echoes nothing 외부  공백이없는 경우 변수는 실제로 test 에 할당됩니다. . 설명하기 위해 :

    =1
    
    

    위에서 볼 수 있듯이 $ f==3 $ echo $f =3 $ [ 10==12 ] && echo yes yes  변수 f==3 를 설정합니다   $f 로 .

    그래서 당신의 =3 에서  블록, 테스트중인 것은 항상 true로 평가되는 빈 문자열이 아니며 if  실행됩니다. 이것은 작동합니다 :

    if
    
    

    또한 if [ "$choice" == "1" ] then baseinstall fi  또는 =  bash에서 문자열 비교를 수행하십시오. 산술 비교를 원합니다 :

    ==
    
    

  • 답변 # 2

    바꾸기 :

    if [ "$choice" -eq "1" ]
    then
        baseinstall
    fi
    
    

    포함 :

    if [ "$choice"==1 ]
    
    

    모든 후속 테스트에 대해 동일하게 수행하십시오.

    설명 쉘이 if [ "$choice" = 1 ] 를 볼 때 , 하나의 문자열을 봅니다. 만약 "$choice"==1  예를 들어 2이면 문자열 choice 가 표시됩니다. . 이것은 평등 테스트가 아닙니다. 문자열입니다. 비어 있지 않은 문자열이므로 테스트에서 true를 반환합니다. 따라서 모든 선택이 실행됩니다.

    평등 테스트를 인식하려면 공백이 필요합니다.

    2==1 를위한, 그리고 사소한 점으로서  스타일 테스트에서 평등의 상징은 [ 입니다. . bash는 = 를 수락합니다  그럴 수도 있지만 정확하지 않으며 다른 쉘에서는 작동하지 않습니다.

    와이즈 비즈 탐험  명령 행에서 테스트

    와이즈 비즈 방법을 쉽게 탐색 할 수있다  테스트는 명령 행에서 작동합니다. 먼저 빈 문자열이 false를 테스트한다는 것을 보여주십시오.

    ==
    
    

    빈 문자열이 아닌 경우에 해당합니다 :

    [...]
    
    

    이제 [ 를 보자 :

    $ if [ "" ]; then echo True; else echo False; fi
    False
    
    

    와이즈 비즈 이후  비어 있지 않은 문자열이며 true를 테스트합니다.

    이제 공백을 추가하고 평등 테스트를 해보자 :

    $ if [ abc ]; then echo True; else echo False; fi
    True
    
    

    추가적인 미묘 함으로서 2==1  여기서 잘 작동하는 문자열 평등을 테스트합니다. 숫자가 같은지 테스트하려면 $ if [ 2==1 ]; then echo True; else echo False; fi True 를 사용하십시오.  대신

    2==1
    
    

  • 답변 # 3

    다른 사람들이 언급했듯이, 당신의 $ if [ 2 = 1 ]; then echo True; else echo False; fi False $ if [ 2 = 2 ]; then echo True; else echo False; fi True  진술은 구문 상 부정확하지만, 전체 접근 방식이 약간 거칠다는 점도 주목할 가치가 있습니다. 이 스크립트의 흐름이 크게 개선 될 수있는 몇 가지 영역이 있습니다. 특히 나중에 읽고 편집하기가 더 쉽습니다.

    먼저 = 할 수 있습니다   -eq 에서 반복적으로 선택  고리. 이런 식으로 가능한choice가 사용자에게 선택되고 선택기에 자동으로 생성되지만 스크립트 내에서 다음 중 하나에 대해 걱정하지 않고 문자열 목록에 모두 함께 묶을 수 있습니다.

    $ if [ 2 -eq 2 ]; then echo True; else echo False; fi
    True
    
    
    이것은 호출 된 if test ...;fi 를 인코딩합니다.  사용자 친화적 인 설명을 stdout에 동시에 인쇄하면서 위치 매개 변수 배열에 삽입합니다.

    선택한 목록을 set 에 작성하면  그렇게하는 동안 진행 상황을 인쇄하면 for  작은 루프에서 사용자의 선택은 입력을 확인하면서 너무 많은 실패한 시도 후에 종료됩니다 :

    set --
    for c in \
        "Base install:base_fn"                             \
        "Mintrepos:mint_fn"                                \
        "Asusn13 driver:asus_fn"                           \
        "Install Standard openbox:std_obox_fn"             \
        "Install Xfceopenbox:xfce_obox_fn"                 \
        "backing up standard open box config:bkup_fn obox" \
        "backing up openboxfce:bkup_fn xfce"              
    do
        set -- "$@" "${c##*:}"
        printf "'%s' = $#\n" "${c%:*}"
    done
    
    

    마지막으로 fn_name 할 수 있습니다  불필요한 매개 변수를 없애고 "$@" 를 호출하십시오. :

    read
    
    

    앞에 0이 없는지 확인하는 것이 좋습니다. 와이즈 비즈  사용자가 너무 높은 숫자를 선택하면 오류가 발생합니다.

    chk=$((($#<1)*5))                           #if not at least one choice quit
    until [ "$((chk+=1))" -gt 5 ] && exit 1     #chks up to 5 times or quits
    printf '\nSelect: '                         #prompts for each try
    read -r c && [ -n "${c##*[!0-9]*}" ]        #fails if input not number or empty
    do echo "Invalid selection."; done          #prints a notice and retries
    
    

    이것은 위치 선택을 매우 유용하게 만드는 숫자 선택 목록을위한 것입니다. 더 일반적으로 당신은 shift 를 사용할 수 있습니다  진술 :

    $1
    
    

    이것은 많은 쉘을 모방하는 휴대용 수단이지만( shift "$((c-1))"; $1 포함) )shift 로 제공됩니다.   [ "$((c=$(printf %.d "$c")))" -gt 0 ] || exit shift "$((c-1))" && $1 가 소개 한 진술  몇 년 전

    case 에서 :

    case "$choice" in (pattern 1) do as necessary for a match;; (pattern 2) do otherwise for this match;; (pattern 3) continue this wise for each;; (*) until there isn't a match ;; esac  이름[ bash  단어];와이즈 비즈  목록;와이즈 비즈

    다음에 나오는 단어 목록이 확장되어 항목 목록이 생성됩니다. 확장 된 단어 집합은 표준 오류에 인쇄되며 각각 앞에 숫자가 표시됩니다.in이 생략되면 위치 매개 변수(또는 select )이 인쇄됩니다 (아래의 매개 변수 참조). 와이즈 비즈  프롬프트가 표시되고 표준 입력에서 줄을 읽습니다.

    ksh

관련 자료

  • 이전 리눅스 커널 구축 방법
  • 다음 linux - awk가있는 부분 집합 행