第2章:标准输入与输出
2.1、echo 和 printf终端打印
echo显示命令默认情况每次调用后会添加一个换行符。
echo 使用带单引号时,Bash不会对单引号中的变量(如$var)求值,只会按照原样显示,如果需要显示变量(如$var)的求值,只需要加上双引号或去掉单引号即可。
范例1:
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
var="hello world!"
echo ‘$var’
echo "$var"
echo $var
[root@cloucentos6 home]# ./test.sh
$var
hello world!
hello world!
printf显示命令默认情况不会自动换行,需要后面加\n换行符号,同时加上单引号或双引号。
printf 显示命令可以使用格式字符串,如%s、%c、%d、%f等都是格式替代符,其所对应的参数可以置于带引号的格式字符串之后。
范例2:
[root@cloucentos6 home]# cat ./test.sh
#!/bin/bash
printf "%-10s %-10s\n" Name Mark
printf "%-10s %-4.2f\n" Tom 99.9999
printf "%-10s %-4.2f\n" Key 77.7777
[root@cloucentos6 home]# ./test.sh
Name Mark
Tom 100.00
Key 77.78
标注:%s输出一个字符串,-10左对齐且宽度为10的字符串替代( - 表示左对齐)
%f表示按浮点数格式输出, -4.2分别表示 – 表示左对齐,4表示取前面4位数输出,2表示保留小点两位数,每行格式字符串后都需要加一个换行符\n
2.2、read接收键盘输入
read -n 命令从输入中读取n个字符并存入变量var
范例1:限制输入超过4个字符,如果输入超过4个字符直接显示。
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
echo "请输入4个字符以内:"
read -n 4 var1
echo
echo "打印输出:"
echo "$var1"
[root@cloucentos6 home]# ./test.sh
请输入4个字符以内:
3333
打印输出:
3333
read –s 命令键盘输入的字符不回显,只显示输出。
范例2:
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
read -s var1
echo $var1
[root@cloucentos6 home]# ./test.sh
222
read -p 显示提示信息
范例3:
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
read -p "请输入你的拼音名字:" var
[root@cloucentos6 home]# ./test.sh
请输入你的拼音名字:zhangshang
Read -d 用定界符结束输入行
范例4:输入%就结束输入
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
read -d "%" var
[root@cloucentos6 home]# ./test.sh
abc
123
%[root@cloucentos6 home]#
Read -t 特定时间内读取输入
范例5:超过3秒未输入任何字符自动结束脚本
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
if
read -t 3 -p "请输入你的拼音名字:" name
then
echo "hello $name"
else
echo
echo "你已超过3秒未输入,已结束输入"
fi
exit 0
[root@cloucentos6 home]# ./test.sh
请输入你的拼音名字:zhangshang
hello zhangshang
[root@cloucentos6 home]# ./test.sh
请输入你的拼音名字:
你已超过3秒未输入,已结束输入
2.3、读取命令序列输出
Shell脚本特性之一就是可以轻松将多个命令或工具组合起来生成输出,一个命令的输出可以作为一个命令的输入,而这个命令的输出又可以传递给另一个命令当成输入,依次类推,这种命令组合的输出可以被存储在一个变量中。
使用管道命令“|”连接每一个过滤器(命令或工具)。
范例1:ls列出当前目录输出当成cat –n的输入内容加上行号,再输出重写向到文件out.txt
[root@cloucentos6 home]# ls | cat -n > out.txt
[root@cloucentos6 home]# cat out.txt
1 \
2 lost+found
3 out.txt
4 test.sh
使用子shell方法也可以实现,子shell本身是独立进程,可以使用 ( ) 操作符定义子shell。
范例2:将ls | cat –n组合命令定义成一个变量cmd,再直接输出变量cmd,添加\n换行符。
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
cmd=$(ls | cat -n)
echo "$cmd\n"
pwd
(cd /home; ls)
pwd
[root@cloucentos6 home]# ./test.sh
1 \
2 lost+found
3 out.txt
4 test.sh\n
/home
\ lost+found out.txt test.sh
/home
范例3:通过引用子shell的方式保留空格和换行符,可以添加双引号,以保留空格和换行符 \n
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
cmd="$(ls | cat -n)"
echo "$cmd"
[root@cloucentos6 home]# ./test.sh
1 \
2 lost+found
3 out.txt
4 test.sh
范例4:使用反引用方法也可以用于存储命令输出。反引号和单引号不是一回事,它位于键盘的 ~ 键上。
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
cmd=`ls | cat -n`
echo "$cmd\n"
[root@cloucentos6 home]# ./test.sh
1 \
2 lost+found
3 out.txt
4 test.sh\n
2.4、重定向与管道
< 重定向改变标准输入
[root@localhost home]# cat abc.txt
abcdef
[root@localhost home]# tr -d 'f' < abc.txt #把tr –d ‘f’删除f字符的命令输入到掉abc.txt文本里
abcde
> 重定向改变标准输出,输出的内容会覆盖原来的文件内容
[root@localhost home]# ifconfig > abc.txt #把ifconfig命令输出的内容输出到abc.txt文本
>> 重定向改变标准输出,输出的内容不会覆盖原来的文件内容,只会追加到原来文件内容的后面
[root@localhost home]# ifconfig >> abc.txt #把ifconfig命令输出的内容输出到abc.txt文本
| 管道命令
可以把< 输入 和 > 输出连接起来,可以把两个命令衔接在一起,把第一个命令的标准输出当作第二个命令的标准输入。
[root@localhost home]# ifconfig | grep "inet addr" #把ifconfig输出的结果通过管道命令给grep当作输入截取以inet addr开头的信息。
inet addr:192.168.0.102 Bcast:192.168.0.255 Mask:255.255.255.0
inet addr:127.0.0.1 Mask:255.0.0.0
2.5、交互输入自动化
交互式输入是指只有当命令要求获取输入时,才由用户手动输入。
范例1:读取交互输入脚本
[root@cloucentos6 home]# cat test.sh
#!/bin/bash
read -p "Enter number:" no
read -p "Enter name:" name
echo you have entered $no $name
[root@cloucentos6 home]# ./test.sh
Enter number:2
Enter name:zhang
you have entered 2 zhang
[root@cloucentos6 home]# echo -e "2\nzhang\n" | ./test.sh
you have entered 2 zhang
2.6、波浪号展开与通配符
Shell有两种与文件名相关的展开。第一种是波浪号展开,另一种全局展开或者路径展开。
2.6.1、波浪号展开
在命令行字符串的第一个字符为波浪号 ~ 或者变量指定(例如PATH或 CDPATH)的值里任何未被引号括起来的冒号之后第一个字符为波浪号 ~ 时,shell变加执行波浪号展开。波浪号展开的目的是将用户根目录的符号型表示方式,改变实际的目录路径。可以采用直接或间接方式执行此程序的用户,如未明白指定,则为当前的用户:
[root@cloucentos6 ~]# ls $HOME #显示当前用户HOME目录
[root@cloucentos6 ~]# ls ~ #显示当前用户HOME目录
使用波浪号的好处:
这是一种简介的概念表示方式。
这可以避免在程序里把路径名称直接编码。
2.6.2、通配符
寻找文件名里的特殊字符,也是shell提供的服务之一。当它找到这类字符时,会将它们视为要匹配的模式,也就是,一组文件的规格,它的文件名称都匹配于某个给定的模式。
标注:通配符与正则表达式的特殊字符作用不一样(第3章会介绍正则表达式)
使用set结构的通配符如下所示: