![在 bash 脚本中使用带有“~”或“$HOME”的 cd 命令时出现问题](https://linux22.com/image/860057/%E5%9C%A8%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89%E2%80%9C~%E2%80%9D%E6%88%96%E2%80%9C%24HOME%E2%80%9D%E7%9A%84%20cd%20%E5%91%BD%E4%BB%A4%E6%97%B6%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98.png)
我们知道,~
并$HOME
参考当前用户的主目录。(对我来说echo ~
= echo $HOME
= pandya
)。
但我不能在 Bash 脚本中使用它。这是一个简单的示例脚本:
#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
cd $dir1
但执行时会出现错误No such file or directory
如下:
$ ./script
Enter Directory Path:~/Desktop
./script: line 4: cd: ~/Desktop: No such file or directory
如果/home/pandya
用来代替~
,那么它就是有效的。
同样的问题$HOME
。
那么,如何在这样的 bash 脚本中正确使用cd
with~
或?$HOME
答案1
您可以使用以下方法解决此问题评估命令 :
#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
eval cd "$dir1"
因为您的代码中$dir1
不会存储~/Desktop
但它会存储/home/user/Desktop
所以您可以使用 eval 命令。
理解评估命令这里
答案2
这是一个有效的例子。
正如前面所说,从输入扩展变量是关键。
#!/bin/bash
echo -n "Dir:"
read dir1
dir2=`eval echo $dir1`
cd $dir2
pwd
当然,您不应该期望当前 shell 会在脚本执行后改变其工作目录。它将不受影响。
答案3
问题是波浪号扩展发生在变量扩展之前(man bash
详情请参阅)。变量扩展只发生一次,因此$dir1
被扩展,但其中的字符串$HOME
没有被扩展。
将目录路径指定为命令行参数可能比read
从控制台读取更容易:shell 将为您扩展它:
#!/bin/bash
dir1=$1
cd "$dir1"
pwd
并称之为
./script ~/Desktop
另一种方法是使用文件对话框,而根本不输入路径:
dialog --dselect / 20 20
答案4
使用 eval 存在安全问题。
只需用变量 HOME 代替波浪号即可。
# Expand Tilde.
d="~/somedir";
d="${d/#\~/${HOME}}";