我可以修改如下字符串:
mod=${orig//[xyz]/_}
它将用_
替换[xyz]的所有出现但如果我有一个字符串如eth0 eth1 eth2,我该如何替换' '换行的空格\ n。以下不起作用。
orig="eth0 eth1 eth2"
mod=${orig// /\n}
这就是我计划使用它的方式:
VRRP_INTERFACE="${VRRP_INTERFACE:-ib0}"
VRRP_ADDITIONAL_INTERFACES="${VRRP_ADDITIONAL_INTERFACES// /\\n}"
cat << EOF > /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
interface ${VRRP_INTERFACE}
state BACKUP
virtual_router_id ${VRRP_ROUTER_ID}
priority ${VRRP_PRIORITY}
advert_int 1
# Monitor these as well
track_interface {
$VRRP_ADDITIONAL_INTERFACES
}
virtual_ipaddress {
${VRRP_VIP} dev ${VRRP_INTERFACE} label ${VRRP_INTERFACE}:1
}
EOF
我注意到,如果我使用 echo -e $ VRRP_ADDITIONAL_INTERFACES当字符串包含&#34; \ n&#34;在字符串中。即用\ n替换\ n而不是\ n。
但是在使用cat << EOF > filename
格式的情况下,它不起作用。
答案 0 :(得分:4)
使用$'\n'
:
$ orig="eth0 eth1 eth2"
$ mod=${orig// /$'\n'}
$ echo "$mod"
eth0
eth1
eth2
此方法将实际换行符放入字符串mod
。
cat << EOF
考虑使用相同替换的shell脚本:
orig="eth0 eth1 eth2"
mod=${orig// /$'\n'}
cat << EOF > test.txt
track_interface {
$mod
}
EOF
cat test.txt
运行时,这是输出:
$ bash script.sh
track_interface {
eth0
eth1
eth2
}
请注意,此方法需要bash
。因此,在类似debian的系统上(sh
为dash
),以下不工作:
$ sh script.sh
matt.sh: 2: script.sh: Bad substitution
答案 1 :(得分:0)
@ John1024解决方案,效果很好
orig="eth0 eth1 eth2"
mod=${orig// /$'\n'}
cat << EOF > test.txt
track_interface {
$mod
}
EOF
答案 2 :(得分:0)
我想出了一个方法。它并不漂亮,但却有效。
将cat分配给变量FILE
然后echo -e "$FILE" > filename
即
VRRP_INTERFACE="${VRRP_INTERFACE:-ib0}"
VRRP_ADDITIONAL_INTERFACES="${VRRP_ADDITIONAL_INTERFACES// /'\n'}"
FILE=$(cat << EOF
vrrp_instance VI_1 {
interface ${VRRP_INTERFACE}
state BACKUP
virtual_router_id ${VRRP_ROUTER_ID}
priority ${VRRP_PRIORITY}
advert_int 1
# Monitor these as well
track_interface {
$VRRP_ADDITIONAL_INTERFACES
}
virtual_ipaddress {
${VRRP_VIP} dev ${VRRP_INTERFACE} label ${VRRP_INTERFACE}:1
}
EOF
)
echo -e "$FILE" > /etc/keepalived/keepalived.conf