2015-02-11 3 views
3

Вот мой кодстроки манипуляция

real_path="/u1/h7/user/469/code/hw4/b.sh" 
while [ "$real_path" != "/" ] 
do 
    echo $real_path 
    real_path=${real_path%/*} 
done 
echo $real_path #just to print the root '/' 

Я хотел бы мой сценарий для печати следующих строк, но real_path=${real_path%/*}, кажется, не работают, какие-либо предложения или другой способ реализации этого?

/u1/h7/user/469/code/hw4/b.sh 
/u1/h7/user/469/code/hw4 
/u1/h7/user/469/code 
/u1/h7/user/469 
/u1/h7/user 
/u1/h7 
/u1 
/

ответ

2

Вы можете использовать dirname:

#! /bin/bash 

real_path="/u1/h7/user/469/code/hw4/b.sh" 
while [ "$real_path" != "/" ];do 
    echo "$real_path" 
    real_path=$(dirname "$real_path") 
done 
echo "$real_path" 

Выходные:

/u1/h7/user/469/code/hw4/b.sh 
/u1/h7/user/469/code/hw4 
/u1/h7/user/469/code 
/u1/h7/user/469 
/u1/h7/user 
/u1/h7 
/u1 
/
1

Поскольку вы используете:

${real_path%/*} 

Он, наконец, полоса /u1 в пустую строку, следовательно, real_path никогда не равными / и вы будете запускать бесконечный цикл.

Чтобы исправить, используйте такой код:

#!/bin/bash 

real_path="/u1/h7/user/469/code/hw4/b.sh" 

while [[ -n "$real_path" ]]; do 
    echo "[$real_path]" 
    real_path="${real_path%/*}" 
    parent="$real_path/" 
done 

echo "final: [$parent]"; 

Это будет печатать:

[/u1/h7/user/469/code/hw4/b.sh] 
[/u1/h7/user/469/code/hw4] 
[/u1/h7/user/469/code] 
[/u1/h7/user/469] 
[/u1/h7/user] 
[/u1/h7] 
[/u1] 
final: [/] 
+0

спасибо! Я не думал! в любом случае вы предлагаете, как я могу перейти в каталог? –

+0

Не мой ли данный сценарий работает на вас? – anubhava

+0

Я бы хотел, чтобы мой последний вывод был родительским каталогом u1, который является корнем. Не null .... –

0

Попробуйте это:

real_path="/u1/h7/user/469/code/hw4/b.sh" 
while [ "$real_path" != "" ];do 
     echo "$real_path"   
     real_path=${real_path%/*}  
done 
+2

Ваш цикл 'for' неверен! (не говоря уже о том, что это бесполезно, если 'real_path' не содержит пробелов или символов глобуса, - и если это произойдет, вы поймете, почему это неправильно). –

+0

@gniourf_gniourf, спасибо. исправляя его сейчас. – michael501

0

Вот еще один способ достижения желаемого вывода используя awk для разделения пути на /:

$ awk -F'/' '{while(NF-->2)print;print FS}' OFS='/' <<<"/u1/h7/user/469/code/hw4/b.sh" 
/u1/h7/user/469/code/hw4 
/u1/h7/user/469/code 
/u1/h7/user/469 
/u1/h7/user 
/u1/h7 
/u1 
/

NF - количество полей. Уменьшая значение, последнее поле удаляется с выхода. Финал print печатает полевой разделитель FS, который был определен как /. Это можно рассматривать как немного обмана, но опять же, все ваши пути, вероятно, имеют / в качестве родительского каталога.

+0

Да, это можно было увидеть как немного обмана, так как я мог напечатать '/' в конце, но спасибо за ответ! Я только что научился использовать awk, спасибо –

+0

Нет проблем. Я думаю, проблема возникает из-за того, что конечный результат является единственным с завершающим косой чертой. Если бы у всех их было одно, можно было бы рассматривать их все одинаково. –

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