shell的echo命令与printf的区别
学习for循环的时候有这样一个例子,例子的说明是“顺序输出字符串中的字符”
#!/bin/bash
for str in 'This is a string'
do
echo $str
done
这个程序的结果为
This is a string
众所周知,echo输出是自带回车的,所以如果按照本程序的想法,就是str每次取字符串的一个字符,然后输出echo,应该是如下的输出。
T
h
i
s
i
s
a
s
t
r
i
n
g
所以到底哪出现了问题?我在每一个循环中加入了计数器
#!/bin/bash
count=0
for str in 'This is a string'
do
count=`expr $count + 1`
echo $str
echo $count
done
#结果为
This is a string
1
说明for str in 'This is a string'的循环,只循环了一次,就是将这个字符串看成了一个整体。
如果将其改为用printf输出呢?
#!/bin/bash
count=0
for str in 'This is a string'
do
count=`expr $count + 1`
printf $str
printf $count
done
#结果为
This1
特别奇怪的现象就是printf只打印了“This”,并且也只循环了一次。 从printf的教程中可以找到
printf 使用引用文本或空格分隔的参数
这说明printf有两种参数的状态,第一是引用文本,第二是用空格分隔的参数。如果不使用格式控制字符串,即用%打头的%d,%s,%f等等,只是输入文本的情况下,printf只接受第一个参数。比如如下的代码:
#!/bin/bash
printf "123" "456" "789"
#得到的结果为:
123
这说明,printf不接受 多余的字段 ,并不能将很多字符串自动输出。我在上一次的实验中,输入参数是用空格分开的,就相当于输入了很多参数,而printf只接受第一个参数:
#!/bin/bash
printf This is a string
#结果:
This
但是如果给参数加上引号,那么就看做为一个输入参数了。修改一下代码可以有:
#!/bin/bash
printf 'This is a string'
This is a string
修复成功。相对比echo的输出:
#!/bin/bash
echo This is a string
#!/bin/bash
echo "This is a string"
这两段的结果都是:
This is a string
echo和printf的区别总结:
1. echo默认自带回车,printf默认不带
2. 不使用格式控制字符串的情况下,如果不加引号的话,printf将空格视为分离不同字符串的分隔符,printf只接受第一个参数,因此要输出带有空格的字符串,必须加分隔符;echo 加不加引号都将一次性输出所有字符,将空格视为字符串的一部分。
另外:
for循环不能以教程中的方法遍历字符串中的字符,教程编写错误。
如果要遍历字符串所有字符串可以采用以下代码
#! /bin/bash
#定义字符串变量
str="this is a string"
#求取字符串的长度
str_size=$(expr length $str)
#for循环遍历,下标从1开始
for ((i=1; i<=$str_size; i++))
do
#读取对应位置的字符
ch=$(expr substr $str $i 1)
echo $ch
done