通常在環境變量中有目錄列表,用:
(如$PATH
,$LD_LIBRARY_PATH
和許多其他)分隔。如何在bash環境變量列表中迭代?
是否有任何工具或標準方法來爲列表中的每個目錄應用命令?
在我的情況下,我需要檢查它們是否存在,但許多其他命令也是有用的,所以我正在尋找一種輕鬆迭代這些列表的方法。
通常在環境變量中有目錄列表,用:
(如$PATH
,$LD_LIBRARY_PATH
和許多其他)分隔。如何在bash環境變量列表中迭代?
是否有任何工具或標準方法來爲列表中的每個目錄應用命令?
在我的情況下,我需要檢查它們是否存在,但許多其他命令也是有用的,所以我正在尋找一種輕鬆迭代這些列表的方法。
正確的方式做到這一點在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
。
你可以這樣做:
$ 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
您還可以利用位置參數的優勢:
IFS=:
set -- $PATH
for dir in "[email protected]"; do
: do something with "$dir"
done
for循環也可以更簡潔了位置參數寫入到循環:
for dir; do ...
取決於你在做些什麼你的腳本,你可能想在覆蓋之前保存當前的IFS:
oldIFS=$IFS
IFS=:
# ...
你的答案涵蓋了一些不尋常的語法,你能解釋一下嗎? – RSFalcon7
@RSFalcon7'bash'是一個非常不尋常的語法破解。 –
@sudo_O更糟糕的是awk;) – konsolebox