我的简单选择菜单脚本有什么问题?

我的简单选择菜单脚本有什么问题?

这是一个简单的脚本,应该让我进入我选择的目录,但它没有按预期工作。

#!/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

您的命令位于引号内。这使得您的 shell 将其cd ~/projects/practice/ocaml视为命令名称。由于您没有此命令,因此它会打印此错误消息。文件的名称中可以包含空格,因此您可以使用名称中包含空格的命令。如果您想运行它,一种方法是像您一样使用引号。

但是您希望 shell 运行命令cd并将路径作为参数。只需远程引号,它应该可以正常工作。

您是否应该break在脚本中使用语句取决于更改目录后您想要执行的操作。如果你想离开循环那么你应该使用它。

笔记运行此脚本后,您cd在 shell 脚本中的命令不会更改当前目录。它只会影响脚本内部的当前目录(除非您使用source而不是运行它),因为当您运行脚本时,会创建新进程,并且cd只会影响当前进程和子进程中的当前目录,而不影响父进程中的当前目录。

答案2

这种情况正是shell的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 。

相关内容