나는 다음을 설정했습니다 read -p "What will you like to name the file name? " filename
. 그러나 사용자가 두 단어 이상을 입력하면 스크립트가 충돌합니다. 사용자 입력에 여러 단어가 있는지 감지하는 방법은 무엇입니까?
죄송합니다! 코드는 다음과 같습니다.
# provide option to rename the .ph file
while true do # 사용자에게 파일 이름을 바꾸고 명령줄 매개변수를 읽으라는 메시지가 표시됩니다. read -p "파일 이름을 변경하시겠습니까? (Y/N) " Answer
# Handle user input
case $answer in
[Yy]* )
echo "Please enter a single word for file name. Otherwise the file name will be sequence.ph."
read -p "What will you like to name the file name? " filename
newname="$filename"
mv sequence.ph $filename.ph
echo "File has been renamed."
break
;;
[Nn]* )
newname="$1_tree"
mv sequence.ph $newname.ph
echo "Output file will have default name $1_tree.ph"
break
;;
* )
echo "Error: Invalid input."
echo "Please enter y/Y or n/N. "
;;
esac
done
답변1
read
읽을 변수가 여러 개 있는 명령을 제공 하면 입력을 단어로 분할하고 각 변수에 대한 단어를 저장하려고 시도합니다. 따라서 두 개의 변수를 지정할 수 있으며 두 번째 변수에 아무것도 없으면 여러 단어가 입력됩니다. 이 같은:
while true; do
read -r -p "What will you like to name the file name? " filename extra # $extra will contain any extra word(s)
if [ -n "$extra" ]; then
echo "One-word filenames only, please"
else
break # Got a valid filename, so break out of the loop
fi
done
참고: 백슬래시를 사용하여 이상한 작업을 수행하는 것을 방지하는 -r
옵션 도 추가했습니다 . read
아마도 필수는 아니지만 일반적으로 좋은 습관입니다.
...하지만 여러 단어로 구성된 파일 이름은 실제로 문제가 되지 않습니다. 일부 고급 작업의 경우 올바른 작업을 수행하는 것이 약간 까다로울 수 있습니다(참조배쉬 FAQ #20), 그러나 기본 목적에서는 변수 참조 주위에 큰따옴표를 넣을 수 있습니다. 이와 같이:
cat "$filename" # Works with multi-word filenames
cat $filename # FAILS with multi-word filenames - don't do this
큰따옴표 변수 참조는 다음과 같습니다.전반적으로 좋은 아이디어네요, 따라서 여러 단어를 포함하는 것을 허용하지 않더라도(/예상) 이 작업을 수행해야 합니다.shellcheck.net변수를 큰따옴표로 묶어야 하는 위치와 기타 일반적인 스크립팅 오류( options 생략 포함 -r
) 를 지적하는 데 능숙하므로 read
이를 통해 스크립트를 실행하는 것이 좋습니다.