#/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等
答案 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