2014-01-11 2 views
0

사용자가 원하는 조작에 따라 다른 숫자를 입력해야하는 메뉴 종류의 프로그램에서이 문제가 발생합니다. 지금은 명령에 여러 플래그를 넣어야하지만 제대로 작동하지 않는 것 같습니다. 캐치 : 내가 직접 하나 개의 변수로 플래그에 입력 할 수 없습니다 나는 아마 당신이 메뉴를 수행하려는 경우)의 뜻에BASH 스크립팅 : 여러 플래그 가져 오기

function fileCpy { 
    printf "Choices:\n1. Interactive copy, answer yes/no before doing the copy: \n2. Make backups of existing destination files\n3. Preserve file attributes\n4. Do a recursive copy\n0. Return to main menu\n" 
     #read choices 
    read $a 
    read $b 
    read $c 
    for choices in $choice ; do 
     case "$choices" in 
      1) 
     a=-i ;; 
      2) 
     b=--backup ;; 
      3) 
     c=-p ;; 
      #4) 
     #4= -R -v;; 
      0) 
     main;; 
    esac 
    echo "$a" 
    echo "$b" 
    echo "$c" 
    printf "\nType the name of the file you wish to copy/backup: " 
    read $fl1 
    printf "\nType the destination file: " 
    read $des1 
    cp $a $b $c $fl1 $des1 
    done 
} 

답변

0

를 종료 할 수 있도록이 경우 목록이해야합니다, 당신은 select 구문을 사용할 수 있습니다 (또는 case/esac). 정보는 here을 참조하십시오.

1

하나의 문제는 read $a 등이 잘못되었습니다. 전혀 읽지 않으려면 read a을 작성해야합니다. 읽는 값은 그대로 변수 이름에 저장되고 $a에 저장됩니다.

또 다른 문제는 무고한 사용자가 스크립트를 계속하기 전에 3 줄의 정보를 입력해야한다는 것이 명백하지만 3 개의 read 줄이 강제로 실행된다는 것입니다.

또 다른 문제점은 (read choice 경유)을 읽지 않기 때문에 for 루프는 아무 것도 할 수 없다는 것입니다.

또 다른 문제점은 스크립트가 사용중인 변수의 이름과 동일한 모든 환경 변수의 값을 상속한다는 것입니다.

또 다른 문제는 파일 이름을 인용하지 않는 것입니다. 공백이나 다른 유사하지 않은 문자가 포함 된 이름이 없으면 대부분 중요하지 않습니다.

표면적 인 문제는 printf 문구가 터무니없이 길다는 것입니다. 한 줄에 하나씩 printf을 사용하십시오. 또는 echo을 사용하십시오. 페이지의 RHS를 스크롤하는 항목은 좋지 않습니다 (80 줄을 고정 길이로 간주하지 않지만 길이가 80 인 행에 대해서는 2 차 페널티가 있습니다. 길이가 이 증가하므로, 더 긴 라인의 고통은 올라갑니다.

다른 레벨에서 인터페이스는 겸손하게 그로테스크합니다. 쉘 스크립트에서의 연습으로, 의미가 있습니다. 좋은 쉘 스크립트를 디자인하는 방법에 대한 연습으로, . 나쁜 디자인

의미를 수있는 디자인입니다

  1. 설정 변수를 비워 : a=""; b=""; c="";
  2. 현재 제공되는 것과 유사한 선택 항목을 제공하지만 명령을 실행하는 옵션을 추가하고 다른 하나는 배송을 포기합니다.
  3. 선택 항목을 읽고 플래그를 설정하는 루프가 있어야합니다.
  4. 사용자가 실행을 선택하면 루프를 종료하고 파일 이름을 묻습니다.
  5. 모두 정상이면 명령을 실행하십시오.

read 명령이 작동하는지 확인해야합니다. 그렇지 않으면 안전을 지키십시오 (어떤 것도 손상시키지 마십시오).

fileCpy() 
{ 
    local a b c file dest 
    echo "Choices:" 
    echo "0. Return to main menu" 
    echo "1. Interactive copy, answer yes/no before doing the copy" 
    echo "2. Make backups of existing destination files" 
    echo "3. Preserve file attributes" 
    echo "4. Do a recursive copy" 
    echo "5. Execute the copy" 
    while printf "Your choice: " && read choice 
    do 
     [ -z "$choice" ] && return 1 # Empty input - failure 
     case "$choice" in 
     (0) return 0;; 
     (1) a="-i";; 
     (2) b="--backup";; 
     (3) c="-p";; 
     (4) d="-R";; 
     (5) break;; 
     (*) echo "Unrecognized response ($choice); please enter 0..5";; 
     esac 
    done 
    [ "$choice" != 5 ] && return 1 # EOF - failure 
    printf "Type the name of the file you wish to copy/backup: " 
    read file 
    [ -z "$file" ] && return 1 # Empty file name - failure 
    printf "Type the name of the destination file/directory: " 
    read dest 
    [ -z "$dest" ] && return 1 # Empty file name - failure 
    cp $a $b $c "$file" "$dest" 
} 

테스트 코드 :

echo "a=$a b=$b c=$c file=$file dest=$dest" 
if fileCpy 
then : OK 
else echo "Failed" 
fi 
echo "a=$a b=$b c=$c file=$file dest=$dest" 

- 모든 (변수의 local의 사용을 목격 약간의 차이가 있지만, 전반적으로 동일한 효과) 함께 그 퍼팅


마지막 블록은 간단한 테스트 장치입니다. 함수 내부에서 사용 된 변수의 값을보고하고, 함수를 실행하고, 함수가 실패하면보고하고, 변수가 설정되지 않았 음을 증명하기 위해 변수를 다시 에코합니다.

당신이 저에게 돈을 지불하지 않으면 인터페이스를 사용하지 않겠지 만 어느 정도는 훈련 연습의 목표를 충족시킵니다.

+0

입력 해 주셔서 감사합니다.하지만 몇 가지 질문이 있습니다. 포인트 3과 같은 루프는 어떻게 생겼습니까? 그것은 기본적으로 내가 모르는 것입니다. 둘째로, 끝 cp $ a $ b $ c $ fl1 $ des1이 효과가 있습니까? 일부 오류를 수정 한 후 (예 : 읽은 변수를 예제 다음에 변경하고 각 경우에 텍스트 문자열 주위에 ""추가) 오류가 발생했습니다. – Skurt