2016-02-11 99 views
3

我是bash脚本编程的新手,我只是想让它工作。我试图得到的是一个脚本,把它转到默认的下载目录,例如/ home/davide/Downloads,然后从Ubuntu下载文件。我得到像默认的下载目录:从bash脚本中的grep输出展开环境变量

OUTPUT=$(grep DOWNLOAD $HOME/.config/user-dirs.dirs) 
DIR=$(echo $OUTPUT | cut -f 2 -d "=" | tr "\"" "\n") 

这是工作正常。 DIR是类似的字符串:

$HOME/Downloads 

问题出现在我尝试cd时发生。它确实是这样的:

cd $HOME/Downloads 

它抛出一个错误,而不是它应该:

cd /home/davide/Downloads 

我已经搜查了很多,看来,我认为,应该扩大完成。我已经通过使用eval命令来扩展它,但它看起来应该是最后的手段。

谢谢你的帮助!

+0

什么'回声 “$ OUTPUT” '秀? – anubhava

+0

你的$ DIR以换行符开头,做一个'echo“ - $ DIR-”' –

+0

它显示:'XDG_DOWNLOAD_DIR =“$ HOME/Downloads”' –

回答

1

从评论中的讨论有两个问题:

  1. $DIR中有一个换行符。我相信这是你原来的错误的原因。我会建议使用不同的方法来确定$DIR

    DIR=$(echo $OUTPUT | sed -r 's/.*="(.*)"/\1/g') 
    
  2. 在变量$DIR字面$HOME可以envsubst取代像

    DIR=$(echo $DIR | envsubst) 
    
+0

实际上,使用你的第一点确实删除了路径前面的换行符,但是这个变量没有被扩展。第二点解决了问题 –

+0

@ Pax_1601是的,你是对的,两个步骤都是必需的,我相应地编辑了答案。 –

0

试试这个:

cd "$(grep DOWNLOAD $HOME/.config/user-dirs.dirs | cut -f 2 -d "=" | tr "\"" "\n")" 

或者,如果不工作:

cd "$(grep DOWNLOAD $HOME/.config/user-dirs.dirs | cut -f 2 -d "=" | tr "\"" "\n" | tr -d "\n")" 
3

使用gnu提供envsubst相关的替代品在外壳格式字符串环境变量:

dir=$(awk -F '["=]+' '/DOWNLOAD/{print $2}' file | envsubst) 
echo "$dir" 
# will output /home/user/Downloads 
cd "$dir" 
+1

好奇;为什么不'awk -F .. 。| envsubst'而不是?这似乎更自然。 –

+0

好点,应该保持简单。谢谢, – anubhava