字符串拆分输出不存储到单独的变量中

时间:2013-02-07 11:33:25

标签: bash shell sh

#/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:找不到命令

最终输出shold是..在变量“eth_0”中字符串值shold为“eth0”与eth_1 .... eth_2 etc..etc ...相同...之后我想在这个varibles eth_0上做一个循环,eth_1等

4 个答案:

答案 0 :(得分:1)

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

#!/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"

答案 1 :(得分:0)

您不能在作业中包含空格,也不能在没有eval的情况下在名称中使用变量:

eth_$i = $eth

必须写:

eval eth_$i=$eth

请参阅Bash script variable declaration - command not found

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

if eval test $eth_$i = blah; then

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

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

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

答案 2 :(得分: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

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

答案 3 :(得分: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