通过从文件中读取'cd'的参数来访问目录

时间:2014-11-18 14:29:29

标签: shell unix cd

我已经编写了一个脚本来通过从文件中读取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失败了。 任何帮助表示赞赏!提前谢谢!

2 个答案:

答案 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方法(引号〜),它可以工作。