在将一些 bash 脚本转换到只有 /bin/sh 可用的平台时,我偶然发现了这个 bash 构造:
#!/bin/sh
RSTPD=/sbin/rstpd
RSTPCTL=/sbin/rstpctl
RSTP=0
bridgeprefix="gbr"
#UPDATE_STRING=-b eth2 eth3
BRIDGES="0"
CSIF[0]="eth2"
SSIF[0]="eth3"
for b in $BRIDGES ; do
echo Starting service bridge $bridgeprefix$b
brctl addbr $bridgeprefix$b || RETVAL=1
if [ $RSTP == 0 ] ; then
brctl stp $bridgeprefix$b on
brctl setbridgeprio $bridgeprefix$b 65000
fi
for br in ${CSIF[$b]} ; do #<--bad substitution
echo Adding CSIF $br on $bridgeprefix$b
ifup $br
brctl addif $bridgeprefix$b $br || RETVAL=1
done
done
我遇到语法错误:第二个 for 循环替换错误。
如何使这个 bash 结构适应 sh 兼容结构?
答案1
鉴于您的数组只有一个元素并且您测试一个常量变量,您的脚本编写时相当于:
#!/bin/sh
bridge="gbr0"
CSIF="eth2"
echo Starting service bridge $bridge
brctl addbr $bridge || RETVAL=1
brctl stp $bridge on
brctl setbridgeprio $bridge 65000
echo Adding CSIF $CSIF on $bridge
ifup $CSIF
brctl addif $bridge $CSIF || RETVAL=1