前言
学习工作中逐渐感受到shell的重要性,但每次学习总是半途而废,不能适应各种神奇的符号和与常用C/C++代码的区别。等到使用的时候无能为力,以python代替。但python某些时候不如shell简洁方便,工作中也有同事喜欢用shell,要拿来使用的时候发现不会修改(尴尬。。。),因此在空闲时刻再次努力学习。本人资历尚浅,请各位路过大神批评指正。前期从菜鸟上学习,后期打算结合相关书籍,以博客记录学习过程。渣渣们一起加油!
两种使用方式
- 在命令行键入命令
#!/bin/bash //本行可省略
$ echo "Hello World !"
Hello World !
- 保存为脚本文件,运行脚本文件
将上述代码保存为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 | 相对应的参数被视为含有转义序列 |
%c | ASCII 字符;显示相对应参数的第一个字符 |
%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 无法进行格式的转换,会返回一个非零的退出状态。