目录:
一.shell选择结构
二.shell循环结构
三.shell条件测试
四.shell内置变量
五.shell变量进阶
六.shell函数定义
七.shell自定义颜色
八.shell数组和信号捕捉
九.bash脚本中使用选项
十.shell案例
一.shell判断结构
1.单分支if语句: if 判断条件;then statement1 statement2 fi 2.双分支语句: if 判断条件;then statement1 statement2 else statment1 statment2 fi 3.多分支语句: if 判断条件1;then statement1 elif 判断条件2;then statement2 elif 判断条件3;then .... else statementnN 4.case多分支 case SWITCH in value1) statement ..... ;; value2) statement ..... ;; value3) statement ..... ;; *) statement ..... ;; esac
二.shell循环结构
1.while循环 while [condition];do (条件成立进入循环) statement1 statement2 ..... done 2.until循环 until [condition];do (条件不成立进入循环) statement1 statement2 ..... done 3.for循环 方式一: for VAR in con1 con2 con3......;do statement1 statement2 ..... done 方式二: for((初始值;限制值;步长));do statement1 statement2 .... done
三.shell条件测试
1.文件测试 -e 文件是否存在 -f 是否是普通文件 -d 是否是目录 -r 是否是读取权限 -w 是否有写权限 -x 是否有执行权限 2.整数测试(仅用于数值间的大小比较) -le 小于等于 -lt 小于 -ge 大于等于 -gt 大于 -eq 等于 -ne 不同于 3.字符测试 == 相同(两个字符串逐个按ASCII字符进行比较全部相同才相同) != 不同 > 大于(逐个按字符的ASCII码进行比较第一个不相等的字符是大于关系) < 小于(逐个按字符的ASCII码进行比较第一个不相等的字符是小于关系) -n 字符串是否非空(非空为true) -z 字符创是否为空(空位true) 4.组合条件测试 -a 两个条件都为真则真,有一个假就是假(当条件一为假此后的条件将不作判断) -o 两个条件只要有一个真就是真(当条件一为真此后的条件不作判断) ! 对条件的结果取反 5.文件权限测试 -r 文件是否具有读权限 -w 文件是否具有写权限 -x 文件是否具有执行权限
四.shell内置变量
bash变量的类型: 本地变量和局部变量: bash脚本中中默认定义的变量就是本地变量,本地变量在整个脚本中都是有效的. 局部变量只在一个代码段中有效: example: --------------- #!/bin/bash function test { VAR=2 } VAR=4 test echo $VAR -------------- 这个脚本的结果为2,VAR为本地变量,VAR=4后调用test函数将VAR=2 -------------- #!/bin/bash function test { local VAR=2 } VAR=4 test echo $VAR -------------- 这个脚本的结果为4 VAR是本地变量全局有效,local VAR这里的VAR是局部变量只在函数的{}内有效 环境变量: 通常声明的变量都是普通变量,只在当前bash进程中有效,然后通过export可以将一个变量声明为环境变量可以在期子进程中共享 [root@wwww ~]# VAR=2 [root@wwww ~]# echo $VAR 2 [root@wwww ~]# bash [root@wwww ~]# echo $VAR [root@wwww ~]# exit #退出子进程 [root@wwww ~]# echo $VAR 2 [root@wwww ~]# export VAR [root@wwww ~]# bash [root@wwww ~]# echo $VAR 2 [root@wwww ~]# 位置变量: 位置变量就是指代脚本中传递的参数(参数之间以空格分隔),第一个参数为$1,第二个参数为$2..... 还可以通过shift将参数移除 #!/bin/bash #遍历三个参数(方式一) echo $1 echo $2 echo $3 echo "-----------------------" #遍历三个参数(方式二) echo $1 shift 1 echo $1 shift 1 echo $1 [root@wwww ~]# bash test.sh a b c a b c ------------- a b c shift后,第一个参数就后移除,第二个参数就会变成第一个参数,还可以一次移除多个参数shift [2|3|4....] 特殊变量: $0 代表脚本的名字 $# 位置变量的个数 $* 所有的位置参数(所有参数作为一个整体是一个单个字符串) $@ 所有位置参数(所有参数作为独立的字符串) ${#@} 传递到脚本的命令行参数个数 $? 返回值(命令执行后的如果成功为0不成功为1-255) $$ 脚本的进程ID(PID) 技巧:计算字符串的长度 VAR="dsadasdsa" ${#VAR}
五.shell变量进阶
${parameter#*word} 变量中第一次出现word的时候右边的全部字符(从左往右) ${parameter##*word} 变量中最后一次出现word的时候右边的全部字符(从左往右) example" FILE=/usr/local/src ${FILE#*/}: usr/local/src ${FILE##*/}: src ${parameter%word*} 变量中第一次出现word的时候左边的全部字符(从右向左) ${parameter%%word*} 变量中最后一次出现word的时候左边的全部字符(从右往左) example: ${FILE%/*}: /usr/local ${FILE%%/*}:
六.shell函数定义
function FUNCTIONNAME{ command } FUNCTIONNAME() { command } 注意:函数传递参数的时候同样也有位置变量也是$1 $2 $3 ....这个主程序中的位置变量不冲突,使用的地方不同含义所代表的位置变量也不同
七.shell自定义颜色
格式如下: \033[字背景颜色;文字颜色m字符串\033[0m" 文本颜色:30黑色,31红色,32绿色,33黄色,34蓝色,35洋红,36青色,37白色; 字背景颜色:40黑色,41红色,42绿色,43黄色,44蓝色,45洋红,46青色,47白色;
八.shell数组和信号捕捉
数组array: shell中所有变量都是字符型 1.声明数组: declare -a VARIABLE 2.数组赋值 赋值方法1: VARIABLE[0]=value VARIABLE[1]=value VARIABLE[2]=value 赋值方法2: VARIABLE=(value1 vaule2 value3....) VARIABLE=([0]=value1 [1]=vaule2 [2]=value3....) 数组使用技巧: 数组元素个数:${#ARRAY[@]} 3.信号捕捉: 使用格式: trap 'command' SIGNAL 正常的脚本通过Ctrl+c发起INT信号后脚本就会自动退出下面这个例子通过捕捉INI信号,让脚本继续运行. example: #!/bin/bash trap 'echo "Catch a singal"' SIGINT while true;do echo "the bash is runing" sleep 1 done 执行结果:(只要使用Ctrl+c想脚本发出SIGINT信号就会打印Catch a singal) the bash is runing the bash is runing the bash is runing Catch a singal the bash is runing the bash is runing Catch a singal the bash is runing Catch a singal the bash is runing the bash is runing Catch a singal the bash is runing Catch a singal the bash is runing the bash is runing the bash is runing the bash is runing the bash is runing the bash is runing the bash is runing
九.bash脚本中使用选项
脚本通常会带有一些选项,然后对于多个选项的分析却是不容易的,要考虑选项的顺序,位置等等 getopts可以方便我们处理脚本的选项 基本使用格式: getopts "select_item" VARIABLE example: getopts "d" OPT 此时若脚本中带有-d选项 那么OPT此时就是d #!/bin/bash while getopts 'dbc' OPT;do case $OPT in d) echo $OPT ;; b) echo $OPT ;; c) echo $OPT ;; *) echo "error" ;; esac done 脚本运行结果: [root@wwww script]# bash opt.sh -b -d -c -e b d c opt.sh: illegal option -- e error 对与多个选项可以使用如上方式,这个脚本可以接受-d -b -c三个选项,每次循环OPT就会代表扫描到的选项, 未知选项getopts会自动报错,但是报错信息不太友好,可以将默认报错信息去除 getopts ":dbc" OPT 在选项的最前面加':'号 目前这样还是不能满足要求,因为只能接受选项不能接受参数,要接受参数可以在选项后面加上':'号,引用参数内容可以使用getopts内置变量OPTARG来引用 example: #!/bin/bash while getopts ':d:b:c' OPT;do case $OPT in d) echo $OPT echo $OPTARG ;; b) echo $OPT echo $OPTARG ;; c) echo $OPT echo $OPTARG ;; *) echo "error" ;; esac done 运行结果: [root@wwww script]# bash opt.sh -b "dsadas" -d "ddd" -c -e b dsadas d ddd c error -b 和 -d可以带参数 -c不可以 带了参数输出来的也是空白
十.shell案例和练习
综合案例:自动创建脚本并写入一些必要的说明信息,还可以多脚本进行语法测试,最后给完成的脚本添加可执行权限 #!/bin/bash while getopts ":d:" SWITCH;do #通过-d选项来引入对脚本文件的描述信息 case $SWITCH in d) DESC=$OPTARG ;; *) echo "`basename -d DESCRPTION filename`" ;; esac done shift $[$OPTIND-1] #将选项和参数都移除 只剩下脚本名这个参数 function Echo_TO_SCR() #输入一些说明信息到脚本文件中 { cat >> $1 <<EOF #!/bin/bash # Name:`basename $1` # Description: $DESC # Author: Jeff # Version: 0.0.1 # Datatime: `date "+%F %T"` # Usage: `basename $1` EOF } if [ -f $1 ];then #判断脚本文件是否存在 if [ `wc -c $1|cut -d' ' -f1` -eq 0 ];then #文件若存在是否是空文件 Echo_TO_SCR $1 fi else Echo_TO_SCR $1 fi vim + $1 #打开脚本文件进行编辑 until bash -n $1 ;do #对脚本文件进行语法测试 read -p "q|Q Quiting editing or others to Continue editing: " OPT case $OPT in q|Q) echo "Quiting." exit 1 ;; *) vim + $1 ;; esac done chmod +x $1 #赋予脚本文件执行权限
本文出自 “专注linux” 博客,谢绝转载!