2016-04-11 29 views
0

我卡在這裏一個bash腳本...SED不解析可變

我有變量:

hostname1="sxxx" hostname2="vbbbb" hostname3="sggg" hostname4="aaa" ... 

我試圖改變每一個文件的第12行有一個文件夾中主機名變量。

的文件是server1.txt server2.txt server3.txt server4.txt ...

我試圖用一個while循環來做到這一點:

i=1 
imax=1 

while [[ $i -le 20 ]] 
do 

    sed -i "12s/.*/$hostname$imax/" server$((imax)).txt 

    ((i++)) 
    ((imax++)) 

     if [[ imax -eq 21 ]] 
      then 
       imax=1 
     fi 

done 

我想sed做的是連接字主機名與IMAX然後用它作爲變量。 也許這個我很清楚:

$hostname=hostname$imax; //for exammple 
sed -i "12s/.*/$hostname/" server$((imax)).txt // i need here the variable $hostname to have the content "sxxx" 
+0

任何特定的原因,你有一堆單獨的'hostnameN'變量,而不是數組'hostname [N]'?一個數組將會更容易處理。 –

+0

這是因爲它們是針對遊戲服務器的,每個服務器都應該有單獨的配置文件 – usersubuser

+0

我不認爲你理解我的問題。我無法想象爲什麼遊戲服務器會關心如果你的shell腳本創建配置文件使用12個元素與12個單獨變量的數組。 –

回答

0

通過使用indirect parameter expansion實現這一目標,

${!var} 

這裏,var - 是一個動態生成的變量名。

試試這個:

sed -i "12s/.*/${!hostname}/" server$((imax)).txt 

例子:

$ hostname1="sat" 
$ i=1 
$ hostval="hostname$i" 
$ echo ${!hostval} 
sat 
0

我會使用以下。使用更改,而不是在sed中切換。然後強烈引用我的sed,並且不引用我的變量。

for i in {1..20}; do 
    eval h='$'hostname$i 
    sed -i '12c'$h'' server$i.txt 
done 

bash 3及以上版本支持循環中的數字範圍,比您的while循環更容易。我也不知道你在用imax做什麼,而不僅僅是我,你在20號出口退出,但是把imax的值改爲1 ......它永遠不會使用。

編輯:b/c我誤讀

-1

基本上,你的問題來自一個變量的解釋。

嘗試使用sed> = 4.2.2,應該使用您的代碼。