Shell学习1:输出

前言

学习工作中逐渐感受到shell的重要性,但每次学习总是半途而废,不能适应各种神奇的符号和与常用C/C++代码的区别。等到使用的时候无能为力,以python代替。但python某些时候不如shell简洁方便,工作中也有同事喜欢用shell,要拿来使用的时候发现不会修改(尴尬。。。),因此在空闲时刻再次努力学习。本人资历尚浅,请各位路过大神批评指正。前期从菜鸟上学习,后期打算结合相关书籍,以博客记录学习过程。渣渣们一起加油!

两种使用方式

  1. 在命令行键入命令
#!/bin/bash //本行可省略
$ echo "Hello World !"
Hello World !
  1. 保存为脚本文件,运行脚本文件
    将上述代码保存为test.sh,在相应目录下修改文件权限
chmod +x test.sh
./tesh.sh

推荐的小型shell脚本开发周期:
1). 在命令行上测试
2). 语法正确后放进独立的脚本并设置权限
3). 使用脚本文件

echo 输出

echo命令将参数打印到标准输出,参数间以空格隔开,以换行符结尾

 echo string
$ echo "hello world" // = echo hello world
hello world
_

有的版本带"-n" 参数会省略结尾的换行符

$ echo -n "enter your username: " // = echo "enter your username: \c"
enter your username: _

echo同样支持转义序列:

转义符说明
\a警示字符
\b退格
\c输出忽略最后的换行符;这个参数后的任何字符(包括接下来的参数)都会被忽略
\f清除屏幕
\n换行
\r回车
\t水平制表符
\v垂直制表符
\ \反斜杠
\0ddd将字符表示为1~3为的8进制数值
\ddd(用于printf,仅在格式字符串中有效)表示1~3位数8进制值的字符

输出原始字符串,不进行转义或取变量(用单引号)

$ name="work hard"
$ echo $name 
work hard
$ echo '$name\"' 
$name\"//(输出单引号内所有内容)
_

在文件中写入程序输出

$ echo "i work hard." > myfile

printf 输出

printf 语法:

printf format-string 	[arguments...]
prinrf format [string...] 		//个人感觉这种方式比较好理解

其中,format-string: 格式控制字符串,最佳提供方式放在引号内的字符串常数
arguments: 参数列表,需与格式对应
注意:printf 不会自动添加换行符,必须显示指定换行符 \n; 出现在参数字符串中的转义序列不会被解释:

$ printf "string: <%s>\n" "a\nb"
string: <a\nb>
_
  • 格式指示符

使用%b 格式指示符时,printf 会解释参数字符串里的转义序列:

$ printf "string: <%b>\n" "a\nb"
string: <a
b>_

在格式字符串里和%b 所打印的参数字符串里大部分转义序列都被相同对待,\c 与 \0ddd 只有搭配%b才有效,\ddd只在格式字符串里才有效。(printf 支持的转义序列与echo 基本相同)
printf 格式指示符:

格式指示符说明
%b相对应的参数被视为含有转义序列
%cASCII 字符;显示相对应参数的第一个字符
%d, %i十进制整数
%o无符号的8进制值
%s字符串
%u无符号的10进制值
%x无符号的16进制值
%X无符号的16进制值
%%字面意义的%
%e浮点格式([-]d.precisione [±]dd)
%E浮点格式([-]d.precisionE [±]dd)
%f浮点格式([-]ddd.precision)
%g%e 或 %f 转换,看哪一个短则删除结尾的零(?)
%G%E 或 %f 转换,看哪一个短则删除结尾的零(?)

最后5个被POSIX标准认为不需要被支持。

printf 可指定输出字段的宽度并支持对齐操作。在% 后的格式表达式可表示为:

%flag width.precision format-specifier

指定字段宽度是,字段内容默认向右对齐,如果需要向左对齐需要指定“-”标志。(以下|为输出,表示字段的实际宽度)

$ printf "|%10s|\n" hello
|   hello|
$ printf "|%-10s|\n" hello
|hello   |
_

precision修饰符对输出精度的控制如下:

转换精度含义
%d, %i, %o, %u, %x, %X要打印的最小位数,当值的位数小于此数时,在数前补零默认精度为1,
%e, %E要打印的最小位数,当值的位数小于此数时,在小数点后补零,默认精度为6,精度为0表示不显示小数点
%f小数点右边的位数
%g, %G有效位数的最大数目
%s要打印字符的最大数目
$ printf "%.5d\n" 15
00015
$ printf "%.10s\n" "a very long string"
a very lon
$ printf "%.2f\n" 123.4567
123.46
$ width=5 prec=6 myvar=42.123456
$ printf "|%${width}.${prec}G|\n" $myvar	//POSIX
|42.1235|
$ printf "|%*.*G|\n" 5 6 $myvar		//ksh93、bash
|42.1235|
_
  • printf 的标志
字符意义
-将字段里已格式化的值向左对齐
space在正值前置一个空格,在负值前置一个负号
+总是在数值前放置一个正号或负号
#%o 有个前置的O;%x 与%X 分别有个前置的0x 与0X;%e、%E、%f总是在结果中有一个小数点;%g 与%G 为没有结尾的零
0以零填补输出,而非空白;仅发生在字段宽度大于转换后的情况,仅应用到数值格式(C语言中应用到所有输出格式,注意区分)
$ printf "|%-10s| |10s|\n" hello world
|hello    | |    world|
$ printf "|% d| |% d|\n" 15 -15
| 15| |-15|
$ printf "%+d %+d\n" 15 -15
+15 -15
$ printf "%x %#x\n" 15 15
f 0xf
$ printf "%05d\n" 15
00015
_

对转换指示符%b、%c、%s,相对应的参数都应视为字符串,否则会被解释为C语言的数字常数。
如果参数的第一个字符为单引号或双引号,则会输出字符的ASCI值:

$ printf "%s is %d\n" a "'a'"
a is 97
_

当参数多余格式指示符时,格式指示符会根据需要再利用;如果格式字符串指示符比参数多事,遗漏的值会被看成零(数值)或是空字符(字符串)。如果printf 无法进行格式的转换,会返回一个非零的退出状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值