-1
#/bin/sh
INPUT_ETH="eth0,eth1,eth2,eth3"
i=0
for eth in $(echo $INPUT_ETH | tr "," "\n")
do

 eth_$i=$eth

 echo "$eth_$i"

i=`expr $i + 1`

if [ $eth_$i = $BLA_BLA]

  then;
       ..............
  fi
      done   

*sh split.sh* *

split.sh:eth_0:找不到命令

split.sh:eth_1:找不到命令

split.sh:eth_2:找不到命令

split.sh:eth_3:找不到命令

最终输出应为 .. 在变量“eth_0”中,字符串值应为“eth0”,与 eth_1....eth_2 等..等...之后我想在此变量 eth_0、eth_1 等上进行循环

4

4 回答 4

1

这是 William Pursell 答案的扩展,如果您实际使用bash并且不限于sh

#!/bin/bash

INPUT_ETH=(eth0 eth1 eth2 eth3)
for eth in ${INPUT_ETH[@]}
do
    echo "$eth"


    if [[ $eth = $BLA_BLA ]]
    then;
       ..............
    fi
done

使用一个真实的数组,不要费心用动态变量名来模拟它们。

如果你真的必须,bash还提供declare命令,这比eval因为它不能执行任意代码更安全:它只是执行参数扩展并设置变量的值:

declare "eth_$i=$eth"
于 2013-02-07T13:33:56.517 回答
0

赋值中不能有空格,也不能在名称中使用没有 的变量eval

eth_$i = $eth

必须写成:

eval eth_$i=$eth

请参阅Bash 脚本变量声明 - 找不到命令

至于第二个问题,你可以这样做:

if eval test $eth_$i = blah; then

或者(你需要更多的空格):

if eval [ $eth_$i = blah ]; then

顺便说一句,chepner 和 glenn jackman 都对使用数组是正确的。我会更进一步说你可能根本不应该这样做。任何时候您想访问正在构建的这些变量,只需迭代原始字符串即可。

于 2013-02-07T11:42:08.193 回答
0

假设 bash:

将字符串拆分为数组

INPUT_ETH="eth0,eth1,eth2,eth3"
IFS=, read -a eth <<< "$INPUT_ETH"
for (( i=0; i<${#eth[@]}; i++ )); do echo "$i - ${eth[$i]}"; done

输出

0 - eth0
1 - eth1
2 - eth2
3 - eth3

要创建动态变量名称,请使用declare

declare eth_$i=$eth

但是使用动态变量名往往会让你的生活更加困难。使用数组,这是他们擅长的。

于 2013-02-07T13:55:58.750 回答
0

正如其他人所说,只需循环列表即可。

一种老式的方法是使用IFS.

#/bin/sh
INPUT_ETH="eth0,eth1,eth2,eth3"
OFS=$IFS IFS=,
set -- $INPUT_ETH
IFS=$OFS
BLA_BLA=eth2
for eth in $*; do
    if [ $eth = $BLA_BLA ] ; then
        echo "$eth OK - now work."
    else
        echo "$eth ignored"
    fi
done

输出:

eth0 ignored
eth1 ignored
eth2 OK - now work.
eth3 ignored
于 2013-02-07T18:32:31.807 回答