2016-05-14 67 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