[英]Iterate over $PATH variable using shell script
如果我在終端中輸入echo $PATH
,我會得到以下結果:
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/fnorbert/.local/bin:/home/fnorbert/bin
我想使用 shell 腳本遍歷這些路徑,但我不知道該怎么做。
我嘗試了以下方法:
for i in 1 2 3
do
echo $PATH | cut -d':' -f$i
done
這將打印前三個路徑,但如果可能的話,我想用變量i
表示每個路徑。
您可以使用分隔符設置為read
:
while read -d ':' p; do
echo "$p"
done <<< "$PATH:"
最簡單的方法可能是將IFS
更改為冒號並讓單詞拆分來完成:
IFS=:
for p in $PATH ; do
echo "$p"
done
但這可能會觸發文件名 globbing,在奇怪的情況下,您的PATH
包含像*?[]
這樣的字符。 您需要使用set -f
來避免這種情況。
盡管無論如何更改IFS
可能會被認為是有問題的,因為它會影響腳本的其余部分。 因此,在 Bash 中,我們可以使用read -a
將路徑拆分為數組,這對於 glob 字符也沒有問題:
IFS=: read -a paths <<< "$PATH"
for p in "${paths[@]}" ; do
echo "$p"
done
帶回聲:
echo "${PATH//:/$'\n'}"
sed:
sed 's/:/\n/g' <<< "$PATH"
時間:
tr ':' '\n' <<< "$PATH"
蟒蛇:
python -c "import os; print os.environ['PATH'].replace(':', '\n')"
迭代用於:
for i in ${PATH//:/ }; do echo $i; done
這是一個微不足道的解決方案,可以稍微擴展您的嘗試
for i in $( echo "$PATH" | cut -d: -f 1- --output-delimiter=" " ) ;
do
echo "$i" ;
done
這里使用的一種技巧是-f 1-
指定所有字段而不是一個字段。
另一個技巧是使用--output-delimiter
選項。
此解決方案對目錄名稱中的特殊字符敏感。
考慮下面的例子
PATH="help me":\*:now
for i in $( echo "$PATH" | cut -d: -f 1- --output-delimiter=" " ) ;
do
echo "$i" ;
done
這將輸出
help
me
foo
now
也就是說,
*
將被 shell 擴展為當前目錄中的文件列表( foo
是駐留在當前目錄中的文件名) 但是,如果您的PATH
不包含任何特殊內容,這將起作用。 否則,或者更確切地說,在所有情況下都采用使用read
的解決方案。
您可以使用 awk 來滿足要求,
echo $PATH | awk -F: '{ for (i=1; i<=NF; i++) {print $i}}'
這在性能上非常有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.