2015-08-28 92 views
0

我在/ etc/bashrc中的pathmunge()函數中映射。這非常有用,因爲它可以使PATH中的重複條目保持不變。在bash中的嵌套變量替換

但是這也應該是其他變量的模式:CDPATH,LD_LIBRARY_PATH不應該有重複的條目。所以我試圖用相同的方式編寫一個varmunge函數。這是它:

# varmunge() allows a one and only one addition of entries into the 
# a PATH like environment variable. Good use cases for this function 
# are: PATH, CDPATH, LD_LIBRARY_PATH 
# example: varmunge PATH $HOME/bin [after | before] 
#!/bin/sh 
varmunge() { 
    case ":$1:" in 
     *:"$2":*) 
      ;; 
     *) 
      if [ "$3" = "after" ] ; then 
       export $1=\$$1:$2   # These both fail 
#    ${1}=${$1}:$2 
      else 
       export $1=$2:\$$1   # blech. 
#    ${1}=$2:${$1} 
      fi 
    esac 
} 

但唉,它不起作用。任何人都可以修理我可憐的巴斯特斯?

謝謝...

發佈在其他情況下,正確的bash腳本可能需要它。

#!/bin/sh 
varmunge() { 
    case ":${!1}:" in 
     *:"$2":*) 
      ;; 
     *) 
      if [ "$3" = "after" ] ; then 
       eval ${1}=${!1}:$2 
      else 
       eval ${1}=$2:${!1} 
      fi 
    esac 
} 

varprint() { 
    echo "${1}=${!1}" 
} 

# test varprint 
VARTEST="path1:path2" 
varprint VARTEST 

# test varmunge 
varmunge VARTEST path1 
varmunge VARTEST path1 after 
varmunge VARTEST path2 
varmunge VARTEST path2 after 
varmunge VARTEST path3 
varmunge VARTEST path3 after 
varmunge VARTEST path3 
varmunge VARTEST path4 after 
varmunge VARTEST path4 

varprint VARTEST 

回答

3

你還沒有解釋什麼是不準確的工作,但很容易弄清楚(或經驗測試)。

無論如何,您在這裏有兩次相同的問題(一旦您嘗試解決但未能使用使其工作的構造)。

你的問題是,$1擴展到名稱你試圖處理的變量不是它的值。

所以,當你打電話varmunge PATH /some/path":$1:"線是擴大你得到:PATH:那裏你打算得到:<value of $PATH>:

要做到這一點,你需要使用(bashism)indirect expansion

所以你想":${!1}:"那裏。

類似地,在您嘗試使用eval indirect assignment模式但export模式的案例中,這種方式不起作用,因此它不會重新展開轉義的變量名稱。

幸運的是,如果您打算使用export,則不需要這個技巧,因爲導出本身完成了作業(類似於declare和)。

因此,您可以酌情使用export "$1=${!1}:$2"export "$1=$2:${!1}"

如果您不想不斷重新導出變量,您也可以使用(再次顯示)printf -v "$1" -- %s "${!1}:$2"等。

+0

謝謝!這很好。 – natersoz