我已经编写了一个脚本来通过从文件中读取cd的值来更改目录(cd)。但是当我运行这个脚本时,我遇到了#34;没有这样的文件或目录"错误。
这是我写过的剧本:
#!/bin/bash
while read line
do
IN=$line
set -- "$IN"
IFS=":"; declare -a Array=($*)
echo "File location : ${Array[1]}"
location=${Array[1]}
echo "Location : $location"
cd "$location"
echo "Pwd :"
pwd
done < location.properties
location.properties文件的内容:
A:~/Downloads
输出:
File location : ~/Downloads
Location : ~/Downloads
./script.sh: line 10: cd: ~/Downloads: No such file or directory
Pwd :
/home/path/to/current/dir
两个echo语句都正确打印了位置,但cd失败了。 任何帮助表示赞赏!提前谢谢!
答案 0 :(得分:1)
~
不会被引号扩展。我通常建议只考虑它是一个交互式功能,并且在脚本中不可用 - 因为脚本中不带引号扩展的副作用并不值得特别受益。
自己执行此扩展步骤:
if [[ $location = "~/"* || $location = "~" ]]; then
location=$HOME/${location#"~"}
elif [[ $location = "~"?* ]]; then
user=${location%%/*}
user=${user#"~"}
read _ _ _ _ _ home _ < <(getent passwd "$user")
location="$home/${location#*/}"
fi
当然,这是过度的,通常的做法是假设脚本在调用之前(如调用shell)在未调用的情况下不会处理包含~
的路径。
答案 1 :(得分:0)
要么删除$ location附近的引号(正如其他注释所示),或者,如果由于某种原因需要引号,请在命令前添加“eval”,如: 评估cd“$ location” 我刚刚尝试了eval方法(引号〜),它可以工作。