1. 基本知识
(1) $HOME: 当前用户的家目录
(2) `pwd`或$PWD:当前目录
(3) 脚本命名避免使用test,通过type -a test,可以查看所有匹配test的命令
gas@docker86-22:~$ type test test is a shell builtin gas@docker86-22:~$ type -a test test is a shell builtin test is /usr/bin/test
(4) 脚本中应包含作者、时间、命令描述等信息。脚本第一行必须以"#!"开头,告诉系统将使用哪个编译器执行该脚本。
#!/bin/bash #: Title : hw #: Date : 2018-12-23 #: Author : "ws"<ws@qq.com> #: Version : 1.0 #: Description : print Hello, World! #: Options : None printf "%s " "Hello, World!"
2. 输入、输出和吞吐量
(1) 命令行中的参数可作为标记参数,如第一个参数$1,第二个参数$2等
例:扩展hw脚本,打印第一个参数内容
#!/bin/bash #: Title : hello #: Date : 2018-12-23 #: Author : "ws"<ws@qq.com> #: Version : 1.0 #: Description : print Hello and the first command-line argument #: Options : None printf "Hello, %s " "$1"
例:如果脚本中增加shift命令,表示标记参数进行移位,shift的值默认值为1,也可以通过shift N进行设置
#!/bin/bash #: Title : hello #: Date : 2018-12-23 #: Author : "ws"<ws@qq.com> #: Version : 1.0 #: Description : print Hello and the first command-line argument #: Options : None shift 3 printf "Hello, %s " "$1"
运行: hello 1 2 3 4,结果为:Hello, 4,即当执行了shift 3后,第四个参数将会变为原来的第一个参数。
注意:shift命令执行后不可逆转,被忽略的参数无法被再次检索。
(2) 特殊参数
1) $#表示标记参数的个数
2) $@表示所有的标记参数
3) $0表示脚本名称
4) $$表示当前进程的pid
5) $?表示最后一行执行命令的返回码
6) $_表示最后一个参数
(3) echo少使用,多使用printf
echo -e参数可以识别转义字符,echo -n参数不识别转义字符。
printf表示按指定格式打印数据。格式为:printf FORMAT ARG ...。FORMAT可以包含普通字符,转义序列和特殊格式。
转义序列包含:
转义序列 | 说明 |
a | 警报 |
回退 | |
e | 转义字符 |
f | 跳页 |
换行符 | |
回车 | |
水平tab | |
v | 垂直tab |
\ | 反斜线 |
nn | 八进制字符 |
xHH | 十六进制字符 |
例:
printf "Q 141 x42 " Q a B
例:当参数多于说明符时,格式字符串将被重用,直到所有参数都被使用。
$ printf "%s " Print arguments on "separate lines" # %s不会进行转义 Print arguments on separate lines $ printf "%b " Print arguments on "separate lines" # %b会进行转义 Print arguments on separate lines $ printf "%d " 23 45 56.78 0xff 011 # %d表示整型 23 45 -su: printf: 56.78: invalid number # 当不符合整型时,会报异常 56 255 9 $ printf "%f " 12.34 23 56.789 1.2345678 # %f表示浮点型,默认保留6位小数 12.340000 23.000000 56.789000 1.234568 $ printf "%e " 12.34 23 56.789 123.45678 # 科学计数法显示 1.234000e+01 2.300000e+01 5.678900e+01 1.234568e+02 $ printf "color: #%02x%02x%02x; " 65 105 225 # 十六进制 color: #4169e1;
例:按指定宽度展示
$ printf "%8s %-15s: " first second third fourth fifth sixth # %8s表示在字符前有8个空格,%-15s表示在字符串后有15个空格 first second : third fourth : fifth sixth : $ printf "%04d " 12 23 56 123 255 # %04d表示当4位数不够时,以0开头补齐4位 0012 0023 0056 0123 0255 $ printf "%12.4s %8.2f " John 2 Jackson 4.579 Walter 2.9 # %8.2f表示精确到2位浮点数 John 2.00 Jack 4.58 Walt 2.90
例:打印到变量中
$ printf -v num4 "%04d" 4 $ printf "%s " "$num4" 0004
(4) stdin, stdout, stderror
$ printf "%s %v " OK? Oops! > FILE 2> ERRORFILE; # 标准输出 ">"重定向到 FILE,错误输出"2>"重定向到ERRORFILE $ printf "%s %v " OK? Oops! 2> /dev/null # 标准错误输出到 /dev/null OK? $ printf "%s %v " OK? Oops! > FILE 2>&1 # 将标准输出和错误输出重定向到同一个文件 $ printf "%s %v " OK? Oops! 2>&1 > FILE # 注意顺序很重要 -su: printf: `v': invalid format character $ printf "%s %v " OK? Oops! &> FILE # bash提供了将标准输出和标准错误输出到相同位置的方法 => &>
将exec 1>tempfile, exec 0<datafile, exec 2>errorfile写入脚本开始位置,则运行脚本时所有的标准输出都会写入tempfile,输入将从datafile中读取,错误异常都会写入errorfile中。
#!/bin/bash exec 1>tempfile exec 0<datafile exec 2>errorfile printf "Hello, $1" abc test
(5) read命令
用于读取标准输入。读取多个变量时,第一个值赋值给第一个变量,第二个值赋给第二个变量,若有剩余的值将全部赋值给最后一个变量。
$ read a b c d Jan Feb Mat Apr May June Jul Aug $ echo $a Jan $ echo $b Feb $ echo $c Mat $ echo $d Apr May June Jul Aug read var < FILENAME # 文件输入作为读取的变量
(6) Pipeline管道
tee命令用于读取标准输入,并写入一个或多个文件中,以及标准输出中。$RANDOM是bash自带变量
$ printf "%s " "$RANDOM" "$RANDOM" | tee FILENAME $ cat FILENAME 16482 6815
(7) 命令替换
常见两种格式:date=`date`; date=$( date )。需要注意针对外部命令有效,使用内置命令执行时将会较慢。