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

 

posted @ 2022-04-12 16:12  zed99  阅读(457)  评论(0编辑  收藏  举报