하나의 문제는 read $a
등이 잘못되었습니다. 전혀 읽지 않으려면 read a
을 작성해야합니다. 읽는 값은 그대로 변수 이름에 저장되고 $a
에 저장됩니다.
또 다른 문제는 무고한 사용자가 스크립트를 계속하기 전에 3 줄의 정보를 입력해야한다는 것이 명백하지만 3 개의 read
줄이 강제로 실행된다는 것입니다.
또 다른 문제점은 (read choice
경유)을 읽지 않기 때문에 for
루프는 아무 것도 할 수 없다는 것입니다.
또 다른 문제점은 스크립트가 사용중인 변수의 이름과 동일한 모든 환경 변수의 값을 상속한다는 것입니다.
또 다른 문제는 파일 이름을 인용하지 않는 것입니다. 공백이나 다른 유사하지 않은 문자가 포함 된 이름이 없으면 대부분 중요하지 않습니다.
표면적 인 문제는 printf
문구가 터무니없이 길다는 것입니다. 한 줄에 하나씩 printf
을 사용하십시오. 또는 echo
을 사용하십시오. 페이지의 RHS를 스크롤하는 항목은 좋지 않습니다 (80 줄을 고정 길이로 간주하지 않지만 길이가 80 인 행에 대해서는 2 차 페널티가 있습니다. 길이가 이 증가하므로, 더 긴 라인의 고통은 올라갑니다.
다른 레벨에서 인터페이스는 겸손하게 그로테스크합니다. 쉘 스크립트에서의 연습으로, 의미가 있습니다. 좋은 쉘 스크립트를 디자인하는 방법에 대한 연습으로, . 나쁜 디자인
의미를 수있는 디자인입니다
- 설정 변수를 비워 :
a=""; b=""; c="";
등
- 현재 제공되는 것과 유사한 선택 항목을 제공하지만 명령을 실행하는 옵션을 추가하고 다른 하나는 배송을 포기합니다.
- 선택 항목을 읽고 플래그를 설정하는 루프가 있어야합니다.
- 사용자가 실행을 선택하면 루프를 종료하고 파일 이름을 묻습니다.
- 모두 정상이면 명령을 실행하십시오.
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
의 사용을 목격 약간의 차이가 있지만, 전반적으로 동일한 효과) 함께 그 퍼팅
마지막 블록은 간단한 테스트 장치입니다. 함수 내부에서 사용 된 변수의 값을보고하고, 함수를 실행하고, 함수가 실패하면보고하고, 변수가 설정되지 않았 음을 증명하기 위해 변수를 다시 에코합니다.
당신이 저에게 돈을 지불하지 않으면 인터페이스를 사용하지 않겠지 만 어느 정도는 훈련 연습의 목표를 충족시킵니다.
입력 해 주셔서 감사합니다.하지만 몇 가지 질문이 있습니다. 포인트 3과 같은 루프는 어떻게 생겼습니까? 그것은 기본적으로 내가 모르는 것입니다. 둘째로, 끝 cp $ a $ b $ c $ fl1 $ des1이 효과가 있습니까? 일부 오류를 수정 한 후 (예 : 읽은 변수를 예제 다음에 변경하고 각 경우에 텍스트 문자열 주위에 ""추가) 오류가 발생했습니다. – Skurt