2015-02-11 174 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

的感谢!我没在想!无论如何,你建议我怎么可以上一个目录? – 2015-02-11 19:28:38

+0

我的脚本不适合你吗? – anubhava 2015-02-11 19:29:45

+0

我想我的最后一个输出是u1的父目录,它是根。非空.... – 2015-02-11 19:32:01

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'不包含空格或者glob字符 - 如果它真的存在,你就会明白为什么它是错误的。 – 2015-02-11 19:34:23

+0

@gniourf_gniourf,谢谢。现在纠正它。 – michael501 2015-02-11 21:50:03

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,谢谢 – 2015-02-11 19:41:22

+0

没问题。我猜这个问题出现了,因为最后的输出是唯一一个有斜线的结果。如果他们都有一个,那么就可以用同样的方式对待他们。 – 2015-02-11 19:52:47