쉘 스크립트로 읽은 사용자 입력에 여러 매개변수가 있는지 확인하는 방법은 무엇입니까?

쉘 스크립트로 읽은 사용자 입력에 여러 매개변수가 있는지 확인하는 방법은 무엇입니까?

나는 다음을 설정했습니다 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이를 통해 스크립트를 실행하는 것이 좋습니다.

관련 정보