【问题标题】:Building Dynamic Variable Names in KornShell在 KornShell 中构建动态变量名称
【发布时间】:2012-08-30 19:17:10
【问题描述】:

我进行了搜索,但没有找到与我正在尝试做的事情完全一样的事情。 我有一个服务器主机名和 IP 列表

  • 塞维拉 |国际音标
  • 服务器b | IPb
  • 服务器 | IPn

我想 cat 这个文件并将每个元素放入变量中

  • Server_Var_1
  • IP_Var_1
  • Server_Var_2
  • IP_Var_2
  • Server_Var_n
  • IP_Var_n

我目前拥有的是以下 KornShell (ksh):

Counter=0
cat hostfile|while read line; do
Server_Var_"$Counter"=echo $line | awk -F"|" '{print $1}'
IP_Var_"$Counter"=echo $line | awk -F"|" '{print $2}'
echo $Server_Var_[*] $IP_Var_[*]
done

感谢任何帮助。

【问题讨论】:

    标签: shell variables dynamic ksh


    【解决方案1】:

    这是对原始问题的轻微改动(@William Pursell 已完美回答)。因此,这段代码将产生相同的输出,但使用了一个复合变量数组。请注意,这是特定于 ksh93 的。

    $ cat  read_hostvars
    
    #!/bin/sh
    
    counter=0
    typeset -a Server
    while IFS=" |" read name ip; do
        Server[counter].name=$name
        Server[counter].ip=$ip
        (( counter++ ))
    done < hostfile
    
    for n in ${!Server[@]}; do
        echo ${Server[n].name}:${Server[n].ip}
    done
    

    【讨论】:

      【解决方案2】:
      $ cat hostfile
      server1 | 192.168.1.101
      server2 | 192.168.1.102
      server3 | 192.168.1.103
      $ cat foo
      #!/bin/sh
      
      counter=0
      while IFS=" |" read name ip; do
          eval Server_VAR_$counter=$name
          eval IP_VAR_$counter=$ip
          : $(( counter += 1 ))
      done < hostfile
      
      echo $Server_VAR_0:$IP_VAR_0
      echo $Server_VAR_1:$IP_VAR_1
      echo $Server_VAR_2:$IP_VAR_2
      $ ./foo
      server1:192.168.1.101
      server2:192.168.1.102
      server3:192.168.1.103
      

      【讨论】:

      • 由于挑剔,OP 要求变量从 1 开始,而不是从零开始 counter=1。递增计数器可以简单地写为(( counter += 1 ))
      • @cdarke (( counter += 1 )) 是一个 bashism(对于在 ksh 中可能工作或可能不工作的构造来说这是一个奇怪的词(如我不知道)),但 : $(( counter += 1 )) 是 posix .
      • 接受您的 POSIX 积分。 (( counter += 1 )) 甚至在 ksh88 中,所以它早于 bash,这个问题被标记为指的是 ksh。
      • (( ... )) 构造确实源自 ksh。可惜它不在 POSIX 中。
      猜你喜欢
      • 2017-06-13
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2012-01-05
      相关资源
      最近更新 更多