目录

echo printf

test



echo printf

printf命令模仿C程序库(library)里的printf()库程序(library routine)。它几乎复制了
该函数的所有功能。不过在Shell层级的版本上,会有些差异。由于printf的行为是由POSIX
标准所定义,因此使用printf的脚本比使用echo移植性好。
如同echo命令,printf命令可以输出简单的字符串:
[root@master ~]#printf "Hello, Shell\n"
Hello, Shell
[root@master ~]#
你应该可以马上发现,最大的不同在于:printf不像echo那样会自动提供一个换行符号。你必须显式
地将换行符号指定成\n。

echo -n "Enter your name:"  //参数-n的作用是不换行,echo默认是换行

要使转义符生效,需加参数-e

在echo命令输出之后附加换行,可以使用\n选项:
$ cat >echo
#!/bin/bash
echo -e "this echo's 3 new lines\n\n\n"
echo "OK"

$ echo "The log files have all been done" >myfile

$ echo "$LOGNAME carried them out at `date`" >>myfile

$ echo "\"/dev/rmt0"\"
"/dev/rmt0"

事实上,echo 除了 -n options 之外,常用选项还有:
-e :启用反斜线控制字符的转换(参考下表)
-E:关闭反斜线控制字符的转换(预设如此)
-n :取消行末之换行符号(与 -e 选项下的 c 字符同意)

关于 echo 命令所支持的反斜线控制字符如下表:
\a:ALERT / BELL (从系统喇叭送出铃声)
\b:BACKSPACE ,也就是向左删除键
\c:取消行末之换行符号
\E:ESCAPE,跳脱键
\f:FORMFEED,换页字符
\n:NEWLINE,换行字符
\r:RETURN,回车键
\t:TAB,表格跳位键
\v:VERTICAL TAB,垂直表格跳位键
:ASCII 八进位编码(以 x 开首为十六进制) :反斜线本身

$ echo -e "a\tb\tc\nd\te\tf"
a       b       c
d       e       f

上例运用 \t 来区隔 abc 还有 def ,及用\n 将 def 换至下一行。

例二:

$ echo -e "\141\011\142\011\143\012\144\011\145\011\146"
a       b       c
d       e       f

与例一的结果一样,只是使用 ASCII 八进位编码。

例三:

$ echo -e "\x61\x09\x62\x09\x63\x0a\x64\x09\x65\x09\x66"
a       b       c
d       e       f

与例二差不多,只是这次换用 ASCII 十六进制编码。

测试变量是否已经设置
有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。此命令格式为:
$ { v a r i a b l e : - v a l u e }
意即如果设置了变量值,则使用它,如果未设置,则取新值。例如:
$ COLOUR=blue
$ echo "The sky is ${COLOR:-grey} today"
The sky is grey today
变量c o l o u r取值b l u e,e c h o打印变量c o l o u r时,首先查看其是否已赋值,如果查到,则使
用该值。变量$COLOR没有设置,所以会打印后面的grey

上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:
$ { v a r i a b l e : = v a l u e }
下面是一个更实用的例子。查询工资清单应用的运行时间及清单类型。在运行时间及类
型输入时,敲回车键表明用户并没有设置两个变量值,将使用缺省值( 0 3 : 0 0和We e k l y),并
传入a t命令中以按时启动作业。
#!/bin/bash
# vartest
echo "what time do you wish start the payroll [03:00]:"
read TIME
echo " process to start at ${TIME:=03:00} OK"
echo "Is it a monthly or weekly run [Weekly]:"
read RUN_TYPE
echo "Run type is ${RUN_TYPE:=Weekly}'
at -f $RUN_TYPE $TIME
在输入域敲回车键,输出结果如下:
what time do you wish start the payroll [03:00]:

process to start at 03:00 OK
Is it a monthly or weekly run [Weekly]:

Run type is Weekly


test

test是Shell中提供的内置命令,主要用于状态的检验,如果结果为0,表示成功,否则表示失败。

需要注意的是test命令不支持Shell中提供的各种通配符,如:

 /> name=stephen  

 /> test $name = [Ss]tephen
 /> echo $?
 1

在Shell中还提供了另外一种用于状态判断的方式:` expr `,和test不同的是,该方式中的表达式支持通配符,如:
   /> name=stephen
   /> [[ $name == [Ss]tephen ]]
   /> echo $?

   0
   #在` expression `中,expression可以包含&&(逻辑与)和||(逻辑或)。
   /> [[ $name == [Ss]tephen && $friend == "Jose" ]]
   /> echo $?
   1
   /> shopt -s extglob   #打开Shell的扩展匹配模式。
   /> name=Tommy
   # "[Tt]o+(m)y"的含义为,以T或t开头,后面跟着一个o,再跟着一个或者多个m,最后以一个y结尾。
   /> [[ $name == [Tt]o+(m)y ]]
   /> echo $?
   0

   /> help [[ 出现帮助信息,但下面的help ((,却提示错误,后来发现是这样的,help \(\(
   在Shell中还提供了let命令的判断方式: (( expr )),该方式的expr部分,和C语言提供的表达式规则一致,如:
   /> x=2
   /> y=3
   /> (( x > 2 ))
   /> echo $?
   1
   /> (( x < 2 ))
   /> echo $?
   0  
   /> (( x == 2 && y == 3 ))
   /> echo $?
   0
   /> (( x > 2 || y < 3 ))
   /> echo $?
   1

-d 目录  -r 读  -w 写  -x 执行  -f 常规文件  -L 符号链接

1)判断表达式
if test  (表达式为真)
if test !表达式为假
test 表达式1 –a 表达式2                  两个表达式都为真
test 表达式1 –o 表达式2                 两个表达式有一个为真
2)判断字符串
test –n 字符串                                   字符串的长度非零
test –z 字符串                                    字符串的长度为零
test 字符串1=字符串2                    字符串相等
test 字符串1!=字符串2               字符串不等
3)判断整数
test 整数1 –eq 整数2                        整数相等
test 整数1 –ge 整数2                        整数1大于等于整数2
test 整数1 –gt 整数2                         整数1大于整数2
test 整数1 –le 整数2                         整数1小于等于整数2
test 整数1 –lt 整数2                          整数1小于整数2
test 整数1 –ne 整数2                        整数1不等于整数2
4)判断文件
test  File1 –ef  File2                            两个文件具有同样的设备号和i结点号
test  File1 –nt  File2                            文件1比文件2 新
test  File1 –ot  File2                            文件1比文件2 旧
test –b File                                           文件存在并且是块设备文件
test –c File                                           文件存在并且是字符设备文件
test –d File                                           文件存在并且是目录
test –e File                                           文件存在
test –f File                                            文件存在并且是正规文件
test –g File                                           文件存在并且是设置了组ID
test –G File                                           文件存在并且属于有效组ID
test –h File                                           文件存在并且是一个符号链接(同-L)
test –k File                                           文件存在并且设置了sticky位
test –b File                                           文件存在并且是块设备文件
test –L File                                           文件存在并且是一个符号链接(同-h)
test –o File                                           文件存在并且属于有效用户ID
test –p File                                           文件存在并且是一个命名管道
test –r File                                            文件存在并且可读
test –s File                                           文件存在并且是一个套接字
test –t FD                                             文件描述符是在一个终端打开的
test –u File                                           文件存在并且设置了它的set-user-id位
test –w File                                          文件存在并且可写
test –x File                                           文件存在并且可执行

test一般有两种格式,即:
test condition

[ condition ]
使用方括号时,要注意在条件两边加上空格。

[root@localhost script]# ll
total 8
-rw-r--r-- 1 root root 1895 Dec 29 20:04 passwd
-rw-r--r-- 1 root root  263 Dec 28 12:12 user
[root@localhost script]# [ -w passwd ]
[root@localhost script]# echo $?
0
[root@localhost script]# test -x passwd
[root@localhost script]# echo $?
1