shell的echo命令与printf有什么不同?

我们很容易知道的echo和printf的区别在于echo自带回车,而printf需要手动加\n,但是今天我发现了更深层次的区别。

今天刚开始学习shell编程。用shell可以编写sh文件,是一种可以在linux中运行的脚本。学习的地址是菜鸟教程,网址如下:

https://www.runoob.com/linux/linux-shell.html

在学习for循环的时候有这样一个例子,例子的说明是“顺序输出字符串中的字符”,网址为https://www.runoob.com/linux/linux-shell-process-control.html

#!/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循环不能以教程中的方法遍历字符串中的字符,教程编写错误。

有问题可以留言,欢迎共同讨论。

猜你喜欢

转载自blog.csdn.net/YNNAD1997/article/details/106875375