2016-07-14 20 views
1

當我嘗試在變量名稱目錄中查看文件列表時,輸出僅僅是我的輸入。在bash中使用可變目錄名稱可以防止我看到該目錄中的文件

read -e -p "Directory with images:" IMG_DIR 
for file in $IMG_DIR/*; do echo "$file"; done 
#if I input ~ at the terminal, ~/* and ~/.* is output 

在另一方面,如果該目錄是靜態輸出工作正常:

for file in ~/{.,}*; do echo "$file"; done 
#outputs all files in ~/ directory 

任何想法,這是爲什麼,我該如何解決?

回答

3

Dmitri Churabov's answer正確診斷您的問題(簡稱:只有文字,存儲在可變時不帶引號的~正在不斷擴大,從來沒有),但用戶輸入使用的eval最好是出於安全考慮,避免

相反,你可以使用參數擴展推出自己的波浪線擴展:

read -e -p "Directory with images: " IMG_DIR 
for file in "${IMG_DIR/#~/$HOME}"/*; do echo "$file"; done 

這代用品(/)可變$HOME的字面~值如果發生在的開頭(#$IMG_DIR的價值。

+0

作爲'文件'是一個命令的操作可以使用別的 –

+0

@mona_sax:我不完全理解。你擔心_variable_'$ file'和_external utility_'file'之間的名稱衝突嗎? – mklement0

+0

是的,我的意思是。 –

3

BASH命令行中的擴展按照定義的順序進行,其中波形擴展在參數擴展之前進行。因此參數值中的~不會被展開。

可以使用eval

for file in "$(eval echo "$IMG_DIR")"/* ; do echo "$file"; done 

這裏觸發波浪線擴展是一個例子:

腳本:

#!/bin/bash 
read -e -p "Directory with images:" IMG_DIR 
file "$IMG_DIR" 
file "$(eval echo "$IMG_DIR")" 

輸出:

Directory with images:~ 
~: cannot open `~' (No such file or directory) 
/home/username: directory 

第一個命令file "$IMG_DIR"失敗,而第二個file "$(eval echo "$IMG_DIR")"成功。

+2

很好的解釋,但對未經檢查的用戶輸入使用'eval'是不明智的,這裏很容易避免。順便說一句:你的命令替換應該用雙引號。 – mklement0

+0

好exlanation。非常有用的信息 –

相關問題