2016-02-11 95 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