Linux基础知识(6)- Shell (四) | echo 命令、printf 命令、test 命令
1. echo 命令
echo 命令会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号。
命令格式:
$ echo [-ne] [字符串]
参数说明:
-n 不要在最后自动换行
-e 打开反斜杠 ESC 转义。
-E 取消反斜杠 ESC 转义 (默认)
echo 的转义序列:
序列 | 描述 |
\a | 发出警告声; |
\b | 删除前一个字符; |
\c | 最后不加上换行符号; |
\f | 换行但光标仍旧停留在原来的位置; |
\n | 换行且光标移至行首; |
\r | 光标移至行首,但不换行; |
\t | 插入 tab; |
\v | 与 \f 相同; |
\\ | 插入 \ 字符; |
\nnn | 插入 nnn(八进制)所代表的 ASCII 字符; |
1) 显示普通字符串
格式如下:
$ echo "It is a test"
这里的双引号完全可以省略,格式如下:
$ echo It is a test
2) 显示转义字符
格式如下:
$ echo "\"It is a test\""
双引号也可以省略,格式如下:
$ echo \"It is a test\"
3) 显示变量
read 命令从输入中读取一行,并把输入行的每个字段的值指定给 shell 变量。脚本格式如下:
#!/bin/sh
echo "Enter some words: "
read s
echo "Good $s"
以上代码保存为 test.sh,name 接收标准输入的变量,运行脚本,显示结果如下。
morning # 输入
Good morning # 输出
4) 显示换行
格式如下:
echo -e "OK! \n" # -e 开启转义
echo "It is a test"
运行,显示结果如下。
OK!
It is a test
5) 显示不换行
格式如下:
#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
运行,显示结果如下。
OK! It is a test
6) 显示结果定向至文件
$ echo "It is a test" > myfile
7) 原样输出字符串,不进行转义或取变量 (用单引号)
格式如下:
$ echo '$name\"'
运行,显示结果如下。
$name\"
8) 显示命令执行结果
格式如下:
$ echo `date`
注: 这里使用的是反引号 `,而不是单引号 '。
运行,显示结果如下。
Thu Jul 24 10:08:46 CST 2014
2. printf 命令
printf 命令模仿 C 程序库(library)里的 printf() 程序。printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符,可以手动添加 \n。
语法格式:
printf format-string [arguments ...]
参数说明:
format-string: 格式控制字符串,可以没有引号,但最好加上,单引号双引号均可。
arguments: 参数列表,使用空格分隔,不用逗号。
printf 的格式指示符:
符号 | 描述 |
%c | 以字符格式输出,只输出参数中的第一个字符 |
%s | 以字符串格式输出 |
%d | 以带符号十进制的格式输出 |
%i | 与 %d 相同 |
%f | 以浮点数的格式输出 |
%e | 以双精度浮点数的格式输出 |
%E | 与 %e 相同,只是字母用大写 |
%g | 以 %f 或者 %e 格式输出 |
%G | 以 %f 或者 %e 格式输出 |
%u | 以无符号十进制格式输出 |
%o | 以无符号八进制格式输出相 |
%x | 以无符号十六进制格式输出,使用 a ~ f 表示 10 ~ 15 |
%X | 以无符号十六进制格式输出,使用 A ~ F 表示 10 ~ 15 |
%b | 输出并解释其中反斜杠 "\" 的特殊字符 |
%q | 以 shell 引用的格式输出,使其可以在标准输入中重用 |
%n | 指定打输出字符的个数 |
%% | 表示输出一个字符的 "%" |
printf 的转义序列:
序列 | 描述 |
\a | 警告字符,通常为 ASCII 的 BEL 字符 |
\b | 后退 |
\c |
抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效), 而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 |
\f | 换页(formfeed) |
\n | 换行 |
\r | 回车(Carriage return) |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 一个字面上的反斜杠字符 |
\ddd | 表示1到3位数八进制值的字符。仅在格式字符串中有效 |
\0ddd | 表示1到3位的八进制值字符 |
1) 一般输出
示例
1 #!/bin/bash 2 3 printf "Hello " 4 printf "world\n" 5 printf 'It is a test string\n' 6 7 printf "format-string 为双引号:%d %s\n" 123 "abc" 8 printf 'format-string 为单引号:%d %s\n' 123 "abc" 9 10 # 没有引号也可以输出 11 printf %s abc 12 printf "\n" 13 14 # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用 15 printf %s abc def 16 printf "\n" 17 18 printf "双引号(1个形参,2个实参): %s\n" abc def 19 20 printf "双引号(3个形参,6个实参): %s %s %s\n" a b c d e f 21 22 # 如果没有 arguments,那么 %s 用 NULL 代替,%d 用 0 代替 23 printf "双引号(2个形参,0个实参): %s, %d\n" 24 25 printf "把参数转换成字符串处理:<%s>\n" "A\nB" 26 printf "把参数转换成特殊字符处理: <%b>\n" "A\nB" 27 printf "处理转义字符:\a"
执行脚本,输出结果如下:
1 Hello world 2 It is a test string 3 format-string 为双引号:123 abc 4 format-string 为单引号:123 abc 5 abc 6 abcdef 7 双引号(1个形参,2个实参): abc 8 双引号(1个形参,2个实参): def 9 双引号(3个形参,6个实参): a b c 10 双引号(3个形参,6个实参): d e f 11 双引号(2个形参,0个实参): , 0 12 把参数转换成字符串处理:<A\nB> 13 把参数转换称换行符处理:<A 14 B> 15 处理转义字符:
2) 格式化输出
示例
1 #!/bin/bash 2 3 printf "%-10s %-8s %-4s\n" Product Count Price 4 printf "%-10s %-8s %-4.2f\n" Phone 1 2000.1234 5 printf "%-10s %-8s %-4.2f\n" Water 2 1.6543 6 printf "%-10s %-8s %-4.2f\n" Coffe 3 15.9876
执行脚本,输出结果如下:
Product Count Price Phone 1 2000.12 Water 2 1.65 Coffe 3 15.99
格式说明:
(1) %s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
(2) %-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
(3) %-4.2f 指格式化为小数,其中 .2 指保留 2 位小数。
3. test 命令
Shell 中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
1) 数值测试
参数 | 描述 |
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
示例
1 #!/bin/bash 2 3 num1=100 4 num2=100 5 if test $[num1] -eq $[num2]; then 6 echo '两个数相等!' 7 else 8 echo '两个数不相等!' 9 fi
输出结果:
两个数相等!
2) 字符串测试
参数 | 描述 |
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
示例
1 #!/bin/bash 2 3 num1="hell2o" 4 num2="hello" 5 if test $num1 = $num2; then 6 echo '两个字符串相等!' 7 else 8 echo '两个字符串不相等!' 9 fi
输出结果:
两个字符串不相等!
3) 文件测试
参数 | 描述 |
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
示例
1 #!/bin/bash 2 3 cd /bin 4 if test -e ./bash 5 then 6 echo '文件已存在!' 7 else 8 echo '文件不存在!' 9 fi
输出结果:
文件已存在!
另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。
示例
1 #!/bin/bash 2 3 cd /bin 4 if test -e ./notFile -o -e ./bash 5 then 6 echo '至少有一个文件存在!' 7 else 8 echo '两个文件都不存在' 9 fi
输出结果:
至少有一个文件存在!