2

我正在尝试通过查看以下输出来测试我用 dd 编写的磁盘擦除实用程序:

00000000
*
00000200

我目前在 shell 脚本中编写了一个简短的示例循环来遍历输出并将其打印出来只是为了验证输出:

dd if=/dev/zero of=sample bs=4M count=1
results=`dd if=sample bs=512 count=1 | hexdump -C | awk '{ print $1 } '`
for i in $results
do
   echo -e "$i"
done

但是当它击中“ *”字符时,它会打印出目录列表。如果我试图逃避它,那么它只会打印出“ $i”。使用以下 if-else 构造似乎没有帮助:

if [ "$i" == "\*" ] #using "*" didn't seem to work either
then
    echo -e "\*"
else
    echo -e "$i"
fi

关于我哪里出错的任何想法?

4

4 回答 4

2

问题是星号已经扩展了for。为避免这种情况,请使用read而不是反引号和数组而不是字符串:

results=()
while read line ; do
    results+=("$line")
done < <( dd if=sample bs=512 count=1 | hexdump -C | awk '{ print $1 } ' )
for i in "${results[@]}" ; do
    echo -e "$i"
done
于 2013-07-24T21:18:26.827 回答
1

如果你想有确切的内容,用单引号引用

$ echo '*'

在这里阅读有关在 bash 中引用的一些信息:http: //tldp.org/LDP/abs/html/quoting.html

于 2013-07-24T21:14:51.827 回答
1

无需创建$results变量然后将其列在 for 循环中。

您可以使用 awk 本身列出您的输出:

dd if=sample bs=512 count=1 2>/dev/null | hexdump -C | awk '{ print $1 }'
于 2013-07-24T21:29:24.413 回答
1

或者,“跳出框框思考”,

只是使用不同的字符?#?

IHTH

于 2013-07-24T21:37:55.180 回答