这是一个简单的脚本,应该让我进入我选择的目录,但它没有按预期工作。
#!/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 。