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