簡単な選択メニュースクリプトにはどのような問題がありますか?

簡単な選択メニュースクリプトにはどのような問題がありますか?

これは私が選択したディレクトリに私を導く簡単なスクリプトですが、期待どおりに動作しません。

#!/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プロセスと子プロセスの現在のディレクトリにのみ影響するため、スクリプト内の現在のディレクトリにのみ影響します(実行の代わりに使用しない限り)。現在のディレクトリを処理します。

おすすめ記事