几点注意事项

  • 一次执行多条命令,可以有如下三种方法, 其区别如下:

    • 分号: 顺序地独立执行各条命令, 彼此之间不关心是否失败, 所有命令都会执行
    • && : 顺序执行各条命令, 只有当前一个执行成功时候, 才执行后面的
    • || : 顺序执行各条命令, 只有当前面一个执行失败的时候, 才执行后面的
  • 设置shell脚本遇到错误时自动退出, 不执行后续命令

    1
    #!/bin/bash -e 或者 set -e

特殊符号使用

1
2
3
4
5
6
7
8
9
10
> 覆写原先的内容
>> 在原先的内容后追加
$? 前一个命令或者函数的返回码, 0表示执行成功
$1 表示第一个参数,$2 表示第二个
$# 命令行参数的个数
$0 当前程序的名称
$* 以"参数1 参数2 ..."的形式保存所有参数
$ 本程序进程PID
$! 上一个命令的PID
脚本内取得输入命令时的参数: $n n代表第几个参数

特殊文件

  • /dev/null 重定向到此文件的数据都会被系统丢掉
  • /dev/tty 自动重定向到一个终端

函数使用

注意: 函数的定义要放在使用之前, 否则的话会报错

1
2
3
4
5
6
7
8
# 函数定义
function funname() {
echo "第n个参数为${n}"
action
retun
}
# 函数使用
funname param1 param2

比较运算

一般用于在if条件中,用[]包裹,注意前后空格。

同时注意为了防止空情况下导致的语法错误, 变量都加上双引号

数值比较

  • -ne 不等于则为真
  • -eq 等于则为真(用来判断数字)
  • -gt 大于则为真
  • -ge 大于等于为真
  • -lt 小于为真
  • -le 小于等于为真

字符串比较

  • var1 = var2 判断两个字符串是否相等
  • var1 != var2 判断两个字符串是否不相等
  • -n “$var” 当字符串的长度大于零时为真(要用双引号包括—)
  • -z “$var” 当字符串的长度等于零时为真(要用双引号包括—)

文件比较

  • -d file 检查file是否存在并且是一个目录
  • -f file 检查file是否存在并且是一个文件
  • -e file 检查file是否存在

逻辑操作运算

  • [ condition1 ] && [ condition2 ] 与
  • [ condition1 ] || [ condition2 ] 或

控制语句语法

控制条件condition用[]包起来,或者使用test语句.注意空格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# if语句:
if [ condition ];then
command
fi
# if-else:
if [ condition ];then
command
elif [ condition2 ];then
command
else
command
fi
# while语句:
while [ condition ];do
command
done

数学运算

推荐使用 $[] 这种格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1.使用 $[],推荐使用(注意在引用变量的时候需要加$)
n1=4
n2=3
n3=$[$n1 * $n2] #输出12

# 2.let用法,提供常用运算符,
注意: 变量前不需要加$运算符且let之后的表达式不要有空格
no1=4;
no2=5;
let result=no1+no2

# 3.expr用法,只识别部分比较简单的运算符
result=`expr 3 + 4`
result=`$no1 + 4`

# 3.注意,已上只能用于整数计算,下面这个也可用于浮点计算(使用bc命令)
# 输出2.24
echo "4 * 0.56" |bc
# 输出81.0
no=54
result=`echo "Sno * 1.5" |bc`
echo $result

文件读取

以每一行为单位依次读取文件

1
2
3
while read line; do
echo $line
done < /home/db2inst1/temp1.txt

数组操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 定义数组(数组下标从0开始)
my_array=(A B "C" D)

# 定义一个空数组
my_array=()

# 读取数组
${my_array[index]}

# 给数组某一项赋值(注意此处不需要使用$)
my_array[0]=1

# 获取数组的长度
${#my_array[@]}

# 遍历数组(每一项为具体值)
for item in ${arr[@]}
do
echo $item
done

# 遍历数组(每一项为数组下标)
for i ${!arr[@]}
do
echo $i
done

# 将某条命令执行的结果全赋值给数组
my_arr=(`awk '{print $2}' file.txt`)

for循环写法

1
2
3
4
5
# 循环10次
for i in $(seq 1 10)
do
echo $i
done

正则表达式

正则表达式可用于sed, awk,grep等命令.

注意, sed只能使用基本正则表达式,不能使用扩展的正则表达式,sed在使用时需要使用//来包裹

基本正则表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 1. 基础用法, 匹配含有word的行
grep 'word' file_name
# 2. ^word 匹配word在行首的行
grep '^word' file_name
# 3. word$ 匹配word在行尾的行
grep 'word$' file_name
# 4. . 匹配除换行符之外的任意一个字符(空格也是一个字符),该处必须有字符存在
# 匹配行中含有at的字符,且at前面有一个字符,如下面第一行,第三行可以匹配,第二行不能匹配,因为at在行首,前面无任何字符
#This is at dog
#at a dog
#th hs cat fd
sed -n '/.at/p' file_name

# 5. * 匹配0个或任意多个前一个正则表达式字符
# 以下全部匹配
#i ha kg
#kkkkg
grep 'k*g' file_name

# 6. [] 搜索集合字符, []括号内的^表示除[]内的字符之外的所有字符
grep '[0-9]' file_name # 匹配出现数字的行
grep '[abc]' file_name # 匹配出现a或者b或者c的行
grep '[a-z]' file_name # 匹配出现小写字母的行
grep '[A-Z]' file_name # 匹配出现大写字母的行
grep '[a-zA-Z0-9]' file_name # 匹配出现字母或数字的行
# 7. x\{\} 匹配字符连续出现的次数,注意若是单词需要分别写
grep 'm\{2\}' file_name #匹配字母m连续出现2次的行, 如 hsjmmjs
grep 'm\{2,4\}' file_name #匹配字母m出现次数在2到4次的文本


# 其他示例
# 匹配一个IP地址
grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file_name
# 匹配形如 "13445676789" 的字符串,开始和结束是双引号,中间是个11位数字
grep '"[0-9]\{11\}"' file_name

扩展正则表达式

grep使用时要加-E参数(好像不加也行?)

1
2
3
4
5
6
7
8
9
10
11
# 1. ? 与星号类似,但前面的字符只能出现0次或1次
#bet 匹配
#bt 匹配
#beet 不匹配
grep -E 'be?t' file_name
# 2. + 与星号类似,但前面的字符至少出现1次(注意点号是指当前位置必须有一个字符)
# bt 不匹配
# bet 匹配
# beeet 匹配
grep -E 'be+t' file_name
# 3.管道符 |, 逻辑或的意思

EOF用法

EOF<<结合使用时,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主程序中。

注意, 在编写代码的时候,最后一个EOF前面不要有任何符号,包括空格, 否则会报语法错误,所以一般为了书写美观, 我都是将涉及到EOF操作的封装为一个函数, 然后调用这个函数。

比如使用lftp命令登录sftp服务器, 然后上传文件,可以使用EOF来实现。

1
2
3
4
5
6
function upload() {
lftp -u ${ftp_user},${ftp_pwd} sftp://${ftp_host}:${ftp_port} <<EOF
cd ${ftp_remote_path}
put file_name.txt
EOF
}