Bash编程(1) 基础

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\n" "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\n" "$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\n" "$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 警报
\b 回退
\e 转义字符
\f 跳页
\n 换行符
\r 回车
\t 水平tab
\v 垂直tab
\\ 反斜线
\nnn 八进制字符
\xHH 十六进制字符

例:

printf "Q\t\141\n\x42\n"
Q    a
B

 例:当参数多于说明符时,格式字符串将被重用,直到所有参数都被使用

$ printf "%s\n" Print arguments on "separate\tlines" # %s不会进行转义
Print
arguments
on
separate\tlines
$ printf "%b\n" Print arguments on "separate\tlines" # %b会进行转义
Print
arguments
on
separate    lines
$ printf "%d\n" 23 45 56.78 0xff 011 # %d表示整型
23
45
-su: printf: 56.78: invalid number # 当不符合整型时,会报异常
56
255
9
$ printf "%f\n" 12.34 23 56.789 1.2345678 # %f表示浮点型,默认保留6位小数
12.340000
23.000000
56.789000
1.234568
$ printf "%e\n" 12.34 23 56.789 123.45678 # 科学计数法显示
1.234000e+01
2.300000e+01
5.678900e+01
1.234568e+02
$ printf "color: #%02x%02x%02x;\n" 65 105 225 # 十六进制
color: #4169e1;

 例:按指定宽度展示

$ printf "%8s %-15s:\n" first second third fourth fifth sixth # %8s表示在字符前有8个空格,%-15s表示在字符串后有15个空格
   first second         :
   third fourth         :
   fifth sixth          :
$ printf "%04d\n" 12 23 56 123 255 # %04d表示当4位数不够时,以0开头补齐4位
0012
0023
0056
0123
0255
$ printf "%12.4s %8.2f\n" 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\n" "$num4"
0004

 (4) stdin, stdout, stderror

$ printf "%s\n%v\n" OK? Oops! > FILE 2> ERRORFILE; # 标准输出 ">"重定向到 FILE,错误输出"2>"重定向到ERRORFILE
$ printf "%s\n%v\n" OK? Oops! 2> /dev/null  # 标准错误输出到 /dev/null
OK?
$ printf "%s\n%v\n" OK? Oops! > FILE 2>&1 # 将标准输出和错误输出重定向到同一个文件
$ printf "%s\n%v\n" OK? Oops! 2>&1 > FILE # 注意顺序很重要
-su: printf: `v': invalid format character
$ printf "%s\n%v\n" 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\n" "$RANDOM" "$RANDOM" | tee FILENAME
$ cat FILENAME 
16482
6815

 (7) 命令替换

常见两种格式:date=`date`; date=$( date )。需要注意针对外部命令有效,使用内置命令执行时将会较慢

 

posted @ 2018-12-26 10:52  mengrennwpu  阅读(326)  评论(0编辑  收藏  举报