shell:弱类型编程语言,即变量在使用之前不需要事前声明,甚至不区分类型。
1.变量类型:
脚本在执行时会启动一个子shell进程,命令行中启动的脚本会继承当前shell环境变量,系统自动执行的脚本(非命令行启动)就需要自我定义需要各种环境变量。
环境变量:export VARNAME=VALUE,作用域为当前shell进程及其子进程,同样可以再变量声明完之后再用export导出变量如:export VARNAME,不用加$符号
本地变量:VARNAME=VLAUE,作用域为整个bash进程
局部变量:local VARNAME=VALUE,作用域为当前代码段
位置变量:
$1,$2,...${10},${11},引用脚本的第几个参数
$_ ,最后一个参数
特殊变量:
$?,上一个命令执行状态返回值。程序状态返回值,0正确执行;1-255:错误执行;1,2,127系统预留
$0,脚本的路径名,可以使用dirname $0获取脚本路径名,basename $0获取文件名。
$#,脚本的参数个数
$*,脚本的所有参数,”$*“代表"$1 $2 $3"
$@,脚本的所有参数,"$@"代表"$1" "$2" "$3"
位移变量:shift,所有参数的位置依次向左移动,并$#减1
变量子串:
${变量},就相当于$变量
${#变量},求变量内容的字符长度
${变量:m},从第m个字符截取变量内容直到结尾
${变量:m:n},在变量内容中从第m个字符开始截取共n个字符
${变量#m*n},在变量内容中的开头开始删除最短匹配m*n
${变量%m*n},在变量内容中的结尾开始删除最短匹配m*n
${变量##m*n},在变量内容中的开头开始删除最长匹配m*n
${变量%%m*n},在变量内容中的结尾开始删除最长匹配m*n
${变量/m/n},替换变量内容中的第一个m为n
${变量//m/n},替换变量内容中的所有m为n
扩展变量:
${变量:-word},如果变量值为空,则返回word,但不代替变量的值
${变量:=word},如果变量值为空,则返回word,并替代变量的值
${变量:?word},如果变量值为空,则word作为标准错误输出,否则输出变量的值
${变量:+word},如果变量值为空,则什么都不做,否则替代变量的值
数组:
静态数组:array=(1 2 3)
动态数组:array=($(ls))
为数组赋值:array[1]=333
打印数组所有元素:${array[@]} 或 ${array[*]}
打印数组长度:${#array[@]} 或 ${#array[*]}
打印单个元素:${array[i]}
循环遍历数组列表:
for n in ${array[*]}
do
echo $n
done
2.使用变量
引用变量:${VARNAME},在不影响调用变量名称时,括号可省略
撤销变量:unset VARNAME,不用加上$符号
查看变量:set,查看当前shell中的变量,不用加任何参数符号。想要查看当前shell中的环境变量可以使用printenv、env、export都可以
追加变量:VARNAME=${VARNAME}AAA,可以在原有变量中追加变量进来,可以加在原有变量前也可以在后面。在不影响变量名称时可以不加大括号{}
3.条件判断
条件测试表达式: [ 表达式 ]、[[ 表达式 ]],有空格
逻辑运算,在[[ ]]中使用
逻辑与:&& ,当第一个条件为真时,后面条件继续执行;当第一个条件为假时,后面不执行
逻辑或:| | , 当第一个条件为假时,后面条件继续执行;当第一个条件为真时,后面不执行
组合条件,在[ ]中使用
-a:与 $$
-o:或||
!:非
if [ $# -eq 1 -a $1 -eq 2 ]
整数比较
-eq:测试两个整数是否相等。如 $a -eq $b
-ne:测试两个整数是否不等。
-gt:测试一个数是否大于另外一个数,可以使用>,但在[ ]中需要加上
-lt:测试一个数是否小于一个数,可以使用<,但在[ ]中需要加上
-ge:大于等于
-le:小于等于
文件测试,有时变量要加""
-e FILE:测试文件是否存在
-f FILE:测试文件是否问普通文件
-d FILE:测试指定路径是否为目录
-r FILE:测试当前用户对指定文件是否有读取权限
-w FILE:测试当前用户对指定文件是否有写权限
-x FILE:测试当前用户对指定文件是否有执行权限
-s FILE:文件存在且大小不为0
-L FILE:文件存在,且为链接文件
f1 -nt f2:文件f1比f2新为真
f1 -ot f2:文件f1比f2旧为真
字符串比较
"STRING1" == "STRING2":测试是否相等,相等为真,不等为假,可以使用=代替,注意等号两端的空格
"STRING1" != "STRING2":测试是否不等,不等为真,相等为假,注意两端的空格
><:大于或小于
-n 字符串:测试指定字符串是否为空,空为真,不空为假,这个不好用,[ $a == "" ]这样判断是否为空
-z 字符串:测试指定字符串是否不空,不空为真,空为假
条件测试
test 测试表达式
[ 测试表达式 ]
[[ 测试表达式 ]]
(( 测试表达式 ))
多分支if语句
if [ 判断条件 ];then statements1 …… elif [ 判断条件2 ];then statements2 …… elif [ 判断条件3 ];then statements3 …… else statements4 …… fi
case语句
case "变量" in 值1) 指令1 ;; 值2) 指令2 ;; *) 指令3 ;; esac
for循环
for 变量 in 列表;do 循环体 done
while循环:适用于循环次数未知的情况,要有退出条件
while [ 条件 ];do 循环体 done
seq循环
`seq [起始数 [步进长度]] 结束数` seq 1 1 100 从1开始,每次增长1,至100结束。默认起始和步长都为1
用while循环读取文件
1.exec方法 exec <FILE while read line do CMD done 2.cat方法 cat FILE | while read line do CMD done 3.while结尾处 while read line do CMD done<FILE
select打印菜单列表
PS3="这里是要打印的循环提示符,跟select是一对" select 变量 in 列表 do CMD done
循环控制
break n:省略n表示退出当前循环,n表示退出循环的层数 continue n:省略n表示忽略后面剩余代码,直接进行下一次循环 exit n:退出当前shell程序,并返回值 return n:函数返回值
4.算术运算
a**b:幂运算
3**3=27
let整数算术运算表达式
let C=$A+$B
$[算术运算表达式]
C=$[$A+$B]
$((整数算术运算符)) 整数运算的常用运算符
C=$(($A+$B))
expr 整数算术表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
C=`expr $A + 2` echo $? 可以判断A是否为整数
let sum+=$i --> sum=sum+i
let i+=1 --> let i++ --> i=i+1 (+=,-+,*=,/=,%=)
bc:计算器,scale=2代表保留两位小数
echo `seq -s "+" 5`=`seq -s "+" 5 | bc`
1+2+3+4+5=15
5.读入
read -p “提示信息” -t 超时时间 变量名
6.正确错误符号
首先需要加载系统方法函数,action关键字
7.函数
function 函数名() { 指令 return n } 或
function 函数名 { 指令 return n } 或
函数名() { 指令 return n }
8.生成随机数的方法
通过RANDOM函数做加密后,用cut截取 echo $RANDOM | md5sum | cut -c 8-10 通过openssl openssl rand -base64 8
9.脚本调试
bash
-n:不会执行该脚本,仅查询脚本的语法问题,并给出错误提示
-v:先将脚本的内容打印出来
-x:调试模式
在脚本中内容中添加set -x开启调试功能,set +x关闭调试功能
脚本内容 set -x 脚本内容 set +x 脚本内容
10.屏蔽键盘信号
可以使用trap -l查看都有哪些信号,常用信号为: HUP 1:挂起 INT 2:中断,相当于ctrl+c QUIT 3:退出,相当于ctrl+ ABRT 6:终止 ALRM 14:报警 TERM 15:终止 TSTP 20:停止,相当于ctrl+z 屏蔽ctrl+c键:trap "[这里可以是命令,也可以是空]" 2 [3 4 5后面可以跟多个] 恢复ctrl+c键:trap ":" 2
批量生成随机字符串
#!/bin/sh source /etc/init.d/functions FILEPATH=/test FILENAME=test [ -d $FILEPATH ] || mkdir -p $FILEPATH for i in `seq 10` do NAME=$(openssl rand -base64 40 | sed s@[^a-z]@@g | cut -c 1-10) touch $FILEPATH/${NAME}_$FILENAME action "`echo $FILEPATH/${NAME}_$FILENAME is created`" /bin/true done
重定向
#标准输出重定向到/dev/null,错误输出到控制台 find / -name passwd > /dev/null #标准输出和错误输出都重定向到/dev/null find / -name passwd > /dev/null 2>&1 find / -name passwd &> /dev/null find / -name passwd >& /dev/null #错误输出重定向到/dev/null,标准输出到控制台 find / -name passwd 2> /dev/null