簡體   English   中英

使用 shell 腳本遍歷 $PATH 變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM