2016-05-14 42 views
-1

隨着echo $PATH我得到這個:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 

而我想在下面的格式得到這些:

/usr/local/sbin 
/usr/local/bin 
... 

我試圖這樣做:

i=1; 
for dir in `echo $PATH|cut -d ':' -f $i` 
do 
    echo $dir 
    i=`expr $i + 1` 
done 

但它不起作用。有人可以幫我解答嗎?

+0

常見,例如,[這](http://stackoverflow.com/questions/25447010/bash-get -all-paths-from-path/25448507)和[this](http://stackoverflow.com/questions/273909/how-do-i-manipulate-path-elements-in-shell-scripts/373476)。 –

回答

2

tr救援:

echo "$PATH" | tr : '\n' 
1

事情是這樣的:

old_IFS=$IFS 
IFS=: 
set -- $PATH 
while [ $# -gt 0 ]; do 
    echo $1; 
    shift; 
done 
IFS=$old_IFS 
+0

你是不是指最後一行中的$ old_IFS?如果用戶執行一些其他操作而不是僅回顯'$ 1',則這種方法應該失敗了, – sjsam

0

你應該這樣做:

i=0 
echo "$PATH" | awk 'BEGIN{RS=":"}{printf "%s\0",$0}'| while read -rd '' line 
do 
echo "$line"; # or do something else with it? 
i=`expr $i + 1` 
done 

這會照顧非標準文件夾中路徑變量如
/usr/local folder & /usr/new/continued/in/next/line folder等。

你也可以使用tr代替awk\0取代\n象下面這樣:

echo "$PATH" | tr : '\0' | while ... 
+0

@Biffen不是'bashism'因爲這個[wiki文章](https://en.wikipedia.org/wiki/Here_document)說至少在bash,ksh或zs中支持它。反正好點。我將編輯答案。 – sjsam

+0

@Biffen:感謝時間,編輯:D – sjsam