几点注意事项
一次执行多条命令,可以有如下三种方法, 其区别如下:
- 分号: 顺序地独立执行各条命令, 彼此之间不关心是否失败, 所有命令都会执行
- && : 顺序执行各条命令, 只有当前一个执行成功时候, 才执行后面的
- || : 顺序执行各条命令, 只有当前面一个执行失败的时候, 才执行后面的
设置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
# 获取数组的长度 ${
# 遍历数组(每一项为具体值) 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 }
|