2013-09-26 52 views
1

通常在環境變量中有目錄列表,用:(如$PATH,$LD_LIBRARY_PATH和許多其他)分隔。如何在bash環境變量列表中迭代?

是否有任何工具或標準方法來爲列表中的每個目錄應用命令?

在我的情況下,我需要檢查它們是否存在,但許多其他命令也是有用的,所以我正在尋找一種輕鬆迭代這些列表的方法。

回答

4

正確的方式做到這一點在bash是單獨給數組:

IFS=: read -ra PATHS <<< "$PATH" 

for P in "${PATHS[@]}"; do 
    echo "$P" 
done 

使用此表格可使丟失的環內的任何變量賦值:

echo "$PATH" | tr : '\n' | while read P; do 
    ALL=$ALL:$P 
done 

echo "$ALL" # => empty string 

另一個好一點的方式來做到這一點是通過:

while read P; do 
    ALL=$ALL:$P 
done <<< "${PATH//:/$'\n'}" 

而且開始猛砸3.1,ALL=$ALL:$P可以進一步簡化爲ALL+=$P

+1

你的答案涵蓋了一些不尋常的語法,你能解釋一下嗎? – RSFalcon7

+3

@RSFalcon7'bash'是一個非常不尋常的語法破解。 –

+0

@sudo_O更糟糕的是awk;) – konsolebox

2

那麼快的事情我會做會

echo $PATH | tr : '\n' | while read dir; do 
    ls "$dir" > /dev/null 
done 

你會得到錯誤行爲不存在任何部件(或無法讀取)。這可能不是防彈的。

+0

謝謝@Poi你的解決方案通過空的領域,但在正常情況下,他們應該被忽略。 – RSFalcon7

+0

@ RSFalcon7好吧我說這不是防彈的:)這可能很容易被修復,雖然我可能很高興知道我的PATH(或CLASSPATH或其他)中有「漏洞」。 – Pointy

1

你可以這樣做:

$ echo $PATH | tr : ' ' | xargs -n1 ls -d 
/usr/local/bin 
/usr/bin 
/bin 
/usr/local/sbin 
/usr/sbin 
/usr/local/sbin 
/usr/sbin 
ls: cannot access /a/b/c: No such file or directory 

對於做到這一點不存在目錄:

$ echo $PATH | tr : ' ' | xargs -n1 ls -d > /dev/null 
ls: cannot access /a/b/c: No such file or directory 
0

您還可以利用位置參數的優勢:

IFS=: 
set -- $PATH 
for dir in "[email protected]"; do 
    : do something with "$dir" 
done 

for循環也可以更簡潔了位置參數寫入到循環:

for dir; do ... 

取決於你在做些什麼你的腳本,你可能想在覆蓋之前保存當前的IFS:

oldIFS=$IFS 
IFS=: 
# ...