간단한 선택 메뉴 스크립트에 어떤 문제가 있나요?

간단한 선택 메뉴 스크립트에 어떤 문제가 있나요?

이것은 내가 선택한 디렉토리로 나를 안내하는 간단한 스크립트이지만 예상대로 작동하지 않습니다.

#!/bin/bash

showMenu() {
    echo "1) ocaml"
    echo "2) python"
    echo "3) csharp"
}

while [ 1 ]
do
    showMenu
    read CHOICE
    case $CHOICE in
        "1")
            "cd ~/projects/practice/ocaml"
            ;;
        "2")
            "cd ~/projects/practice/python"
            ;;
        "3")
            "cd ~/projects/practice/csharp"
            ;;
    esac
done

필요한 모든 폴더가 준비되어 있습니다.

(2) [01:19 PM] ls projects/practice/
csharp/  ocaml/   python/  scripts/ web/     

산출:

(2) [01:19 PM] choice 
1) ocaml
2) python
3) csharp
1
/home/nanda/bin/choice: line 15: cd ~/projects/practice/ocaml: No such file or directory
1) ocaml
2) python
3) csharp

스크립트는 분명히 디렉토리를 찾을 수 없습니다.

cd일종의 대체( ${}또는 사용)를 사용하여 각 옵션 아래에 명령을 넣어야 한다고 생각 {}하지만 이를 수행하는 방법을 잘 모르겠습니다.

cd또한 각 명령 뒤에 break 문을 추가해야 합니까?


. choice예상한 대로 작동하도록 최선을 다해야 합니다 . 더 좋은 점은 다음과 같은 별칭을 입력했는데 작동했다는 것입니다.

alias choice='. choice'

인용하다:
https://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script
https://askubuntu.com/questions/84279/how-to-change-directory-using-script
https://stackoverflow.com/questions/874452/change-current-directory-from-a-script

답변1

명령은 따옴표 안에 있습니다. 이로 인해 쉘은 cd ~/projects/practice/ocaml이를 명령 이름으로 처리합니다. 이 명령이 없으므로 이 오류 메시지가 인쇄됩니다. 파일 이름에 공백이 포함될 수 있으므로 이름에 공백이 포함된 명령을 사용할 수 있습니다. 실행하고 싶다면 한 가지 방법은 했던 것처럼 따옴표를 사용하는 것입니다.

cd그러나 쉘이 경로를 인수로 사용하여 명령을 실행하기를 원합니다 . 원격으로 인용하면 제대로 작동합니다.

break스크립트에서 명령문을 사용해야 하는지 여부는 디렉토리를 변경한 후 수행하려는 작업에 따라 다릅니다. 루프를 벗어나고 싶다면 이것을 사용해야 합니다.

노트이 스크립트를 실행한 후에는 cd쉘 스크립트의 명령이 현재 디렉토리를 변경하지 않습니다. source스크립트를 실행하면 새 프로세스가 생성되고 cd상위 프로세스가 아닌 현재 프로세스와 하위 프로세스의 현재 디렉터리에만 영향을 미치기 때문에 스크립트 내부의 현재 디렉터리에만 영향을 미칩니다(실행하는 대신 사용하지 않는 한 ). 현재 디렉터리를 처리합니다.

답변2

이 상황은 정확히 쉘 select선언의 목적입니다.

select choice in ocaml python csharp; do
    case $choice in
        ocaml|python|csharp) break ;;
    esac
done
echo cd ~/projects/practice/$choice

약간 건조함:

choices=(ocaml python csharp)
select choice in "${choices[@]}"; do
    [[ " ${choices[*]} " == *" $choice "* ]] && break
done
echo cd ~/projects/practice/$choice

답변3

cd 명령 주위에 따옴표가 있습니다. 그것들을 삭제하면 괜찮을 것입니다.

"cd ~/projects/practice/ocaml"

전체 문자열이라는 명령을 실행한다는 의미이므로 공백과 ~ 및 모든 것을 포함하여 이와 같은 명령을 찾습니다.

명령이 디렉토리 인수와 함께 cd가 되기를 원합니다.

관련 정보