这几天在维护别人的代码时碰到如下代码:

alldisks=”/dev/sdb1 /dev/sdb  /dev/sdc1 /dev/sdc  /dev/sda1 /dev/sda”

for i in 1 1 1 1 1 ; do
for tempdev in $alldisks; do
if (something); then
alldisks=$(echo $alldisks | sed -e “s#$tempdev##”)

。。。。。

这段代码的用意很清楚,外层循环循环五次,内层循环对每个设备进行某种判断,然后若是成功则下次外层循环不再对这个设备进行处理。

可是最后一行赋值却被不小心写成了

alldisks=$(echo $alldisks | sed -e “s#$alldisks##”)
于是我就猜测在执行完第一次外层循环后就不会再次执行,可结果是它还可以再执行一次外层循环。

仔细察看了一下如下语句:

alldisks=”/dev/sdb1 /dev/sdb  /dev/sdc1 /dev/sdc  /dev/sda1 /dev/sda”

发现在dev/sdb后面有两个空格,进而发现在echo $alldisks时去掉了一个空格,所以在后面sed时等于什么事情都没有做,于是在第一次执行该语句后效果等同于将alldisks里的多余的空格给去掉了。

继续找发现在echo时若将变量替换放在双引号“$alldisks”内则不会去掉多余的空格

在《Advanced Bash-Scripting Guide》4.2节找到如下示例代码:
hello=”A B C D”
echo $hello # A B C D
echo “$hello” # A B C D
# As you see, echo $hello
and
echo “$hello”
# Why?
# =======================================
# Quoting a variable preserves whitespace.
注意在赋值时BC,CD之间有多个空格

Advertisements