2016-05-14 8 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). –

ответ

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 но заменить \n с \0, как показано ниже:

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

@Biffen Не 'bashism' coz эта [статья wiki] (https://en.wikipedia.org/wiki/Here_document) говорит он поддерживается, по крайней мере, в bash, ksh или zs. Хорошая точка в любом случае. Я отредактирую ответ. – sjsam

+0

@Biffen: Оцените время, Отредактировано: D – sjsam

Смежные вопросы