Bash sed没有解析变量

Bash sed没有解析变量,bash,sed,Bash,Sed,我被这里的bash脚本卡住了 我有一些变量: hostname1="sxxx" hostname2="vbbbb" hostname3="sggg" hostname4="aaa" ... 我试图用主机名变量更改文件夹中每个文件的第12行 for i in {1..20}; do eval h='$'hostname$i sed -i '12c'$h'' server$i.txt done 这些文件是server1.txt server2.txt server3.txt serv

我被这里的bash脚本卡住了

我有一些变量:

hostname1="sxxx" hostname2="vbbbb" hostname3="sggg" hostname4="aaa" ...
我试图用主机名变量更改文件夹中每个文件的第12行

for i in {1..20}; do
   eval h='$'hostname$i
   sed -i '12c'$h'' server$i.txt
done
这些文件是
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
将单词host name与imax连接起来,然后将其用作变量。 也许有了这个,我已经足够清楚了:

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

您可以通过使用
间接参数展开
来实现这一点

${!var}
这里,
var
-是一个动态生成的变量名

试试这个:

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

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

我会用下面的方法。使用change,而不是sed中的switch。然后强引用我的sed,并取消引用我的变量

for i in {1..20}; do
   eval h='$'hostname$i
   sed -i '12c'$h'' server$i.txt
done
Bash3和更高版本支持ForLooop中的数字范围,比while循环更简单。我也不知道你在用imax做什么,而不仅仅是我,b/c你在20时退出,但是把imax值改为1。。。它永远不会使用它


编辑:b/c我误读了

基本上,你的问题来自于一个变量的解释


尝试使用sed>=4.2.2,应该可以与您的代码一起使用。

有没有任何特殊原因,您有一堆单独的
hostnameN
变量,而不是数组
hostname[N]
?阵列会更容易使用。这是因为它们是用于游戏服务器的,在我的情况下,每个服务器都应该有单独的配置文件。我认为您不理解我的问题。我无法想象为什么游戏服务器会关心您创建配置文件的shell脚本是否使用包含12个元素和12个独立变量的数组。