shell脚本进阶部分

脚本进阶:条件语句、循环语句等(不包括linux安装部分)

数值测试:

-gt 是否大于

-ge 是否大于等于

-eq 是否等于

-ne 是否不等于

-lt 是否小于

-le 是否小于等于

unset 变量(删除脚本中临时用到的变量,较好的习惯)

在脚本中,使用{}将多条命令同时运行时,脚本最后需加wait,以结束等待回车环节,否则需手动回车

eval 是先扫描后续内容并替换变量,然后在使用,可解决echo {1..$n} 不打印数列的问题

 

条件选择语句if

if 判断条件1; then

条件为真的分支代码

elif 判断条件2; then

条件为真的分支代码

elif 判断条件3; then

条件为真的分支代码

else

以上条件都为假的分支代码

fi

 

条件判断语句case

case 变量引用 in (注意:变量引用是用$加变量名)

PAT1)

分支1

;;

PAT2)

分支2

;;

*)

默认分支

;;

esac

case支持通配符写法

 

循环语句

for

for 变量名 in 列表;do

循环体

done

 

 

for的另一种c语言格式运用:

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式));do

循环体

done

 

while

while CONDITION; do

循环体

done

命令为真时,开始循环体,直到命令为假

CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环

 

until

until CONDITION; do

循环体

done

命令为假时,才开始循环体,直到命令为真

 

shift

将参数列表左移一个,后面接数字表示每次左移*个参数

 

while循环的特殊用法(遍历文件的每一行):

while read line; do

循环体

done < /PATH/FROM/SOMEFILE

依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

 

select:制作列表工具,一般搭配case形成可选列表

select 变量名 in list

do

循环体命令

done

 

trap:信号捕捉工具

trap ‘触发指令’ 信号

自定义信号所代表的的命令,当接受指定的信号时,执行前面的自定义指令

trap ‘-‘ 信号:恢复原信号的操作

trap -p:打印自定义信号操作内容

 

函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程

语法一:

f_name (){

…函数体…

}

语法二:

function f_name {

…函数体…

}

语法三:

function f_name () {

…函数体…

}

一般只用第一种格式即可

 

数组

数组名和索引

索引:编号从0开始,属于数值索引

关联索引:索引可支持使用自定义的格式,而不仅是数值格式,bash4.0版本之后开始支持

稀疏索引:不连续的索引,中间缺少元素

声明数组

declare -a ARRAY_NAME 普通数组,可以不声明即可使用

declare -A ARRAY_NAME: 关联数组,必须先声明,后使用

注意:两者不可相互转换

数组元素的赋值

(1) 一次只赋值一个元素

ARRAY_NAME[INDEX]=VALUE

weekdays[0]=”Sunday”

weekdays[4]=”Thursday”

(2) 一次赋值全部元素

ARRAY_NAME=(“VAL1” “VAL2” “VAL3″ …)

(3) 只赋值特定元素

ARRAY_NAME=([0]=”VAL1″ [3]=”VAL2” …)

(4) 对交互式数组值对赋值

read -a ARRAY

u显示所有数组:declare -a

引用数组元素

${ARRAY_NAME[INDEX]}

注意:省略[INDEX]表示引用下标为0的元素

引用数组所有元素:

${ARRAY_NAME[*]}

${ARRAY_NAME[@]}

数组的长度(数组中元素的个数):

${#ARRAY_NAME[*]}

${#ARRAY_NAME[@]}

删除数组中的某元素:导致稀疏格式

unset ARRAY[INDEX]

删除整个数组:

unset ARRAY

向数组中追加元素:

ARRAY[${#ARRAY[*]}]=value

${#var}:返回字符串变量var的长度

${var:n}:返回字符串变量var中从第n个字符后的字符开始,到最后(简称偏移量)

${var:n:m} :跳过n个取接下来的m个字符

${var: -n}:取倒数n个字符(-n前面有一个空格)

${var:n:-m}:去掉前n个,去掉后m个,剩下的

${var: -n:-m}:先取后n个 ,再从结果中取后m个(-n前面有空格)(centos6不支持)

${var#*word}:其中word可以是指定的任意字符,var变量是储存字符串变量,这句的功能是当第一次发现关键字时,删除前面的,包括关键字,然后留下后面的(懒惰模式)

${var##*word}:同上,但是出于贪婪模式的搜索关键字

 

${var%word*}:逻辑同上,但是是从后向前开始搜索,并且删除关键字之后的字符串

${var%%word*}:逻辑同上,贪婪模式

 

查找替换

${var/pattern/substr}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之

${var//pattern/substr}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之

${var/#pattern/substr}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之

${var/%pattern/substr}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之

 

查找并删除

${var/pattern}:删除var所表示的字符串中第一次被pattern所匹配到的字符串

${var//pattern}:删除var所表示的字符串中所有被pattern所匹配到的字符串

${var/#pattern}:删除var所表示的字符串中所有以pattern为行首所匹配到的字符串

${var/%pattern}:删除var所表示的字符串中所有以pattern为行尾所匹配到的字符串

字符大小写转换

${var^^}:把var中的所有小写字母转换为大写

${var,,}:把var中的所有大写字母转换为小写(俩逗号)

变量赋值

7.1

declare [选项] 变量名

-r 声明或显示只读变量

-i 将变量定义为整型数

-a 将变量定义为数组

-A 将变量定义为关联数组

-f 显示已定义的所有函数名及其内容

-F 仅显示已定义的所有函数名

-x 声明或显示环境变量和函数

-l 声明变量为小写字母 declare –l var=UPPER

-u 声明变量为大写字母 declare –u var=lower

 

间接变量引用

bash Shell提供了两种格式实现间接变量引用,从而显示var1所表示的真实变量内容

eval tempvar=\$$variable1

tempvar=${!variable1}

 

创建临时文件:

mktemp [OPTION]… [TEMPLATE]

TEMPLATE: filenameXXX

X至少要出现三个

OPTION:

-d: 创建临时目录

-p DIR或–tmpdir=DIR:指明临时文件所存放目录位置

 

install命令:

选项:

-m MODE,默认755

-o OWNER

-g GROUP

示例:

install -m 700 -o wang -g admins source directory

install –m 770 –d /testdir/installdir (创建文件夹)

 

expect命令/语言(使用前确保已安装)

选项

Ø-c:从命令行执行expect脚本,默认expect是交互地执行的

示例:expect -c ‘expect “\n” {send “pressed enter\n”}

Ø-d:可以输出输出调试信息

示例:expect -d ssh.exp

uexpect中相关命令

Øspawn:启动新的进程

Øsend:用于向进程发送字符串

Øexpect:从进程接收字符串

Øinteract:允许用户交互

Øexp_continue 匹配多个字符串在执行动作后加此命令

示例:实现scp中使用expect实现自动化

7.2

示例:在自动化的同时实现继续使用交互式操作,而非自动退出

7.3

示例:实现变量引用手动输入,并相似$1、$2….

7.4

 

 

bash –version 查看bash版本号

函数优先级大于别名

declare -f 查看所有被定义的函数

export -f 或declare -xf 查看所有全局变量

unset f_name 删除定义的某函数

return 在函数中使用,可中途退出函数,但不会退出脚本

kill -l 查看所有信号所代表的的原本命令(trap -l)

continue 停止执行当前循环(后面可接数字表示提前结束该层)

break 停止执行循环体(可接数字,同上)

bash -x test_continue.sh 跟踪后面的脚本,查看后台执行的步骤

true或:都可以使得echo $?为0;fault则默认为1

 

函数内部定义变量时,是同父进程同级的关系,要想只在函数内生效,只需在定义前加local即可:fun () { local name=mage;echo “$name” }

export name全局变量,影响当前shell环境并可传给子shell,不加export是局部变量,只影响当前shell,local name则只影响函数内的shell环境,影响最小(函数内部用declare -i等同于local)declare -ig 其中g则会把其定义变为局部变量

export -f function1可以把该定于函数变成全局变量的命令

修改ssh的配置文件:/etc/ssh/sshd_config 中的7.5若有#usedns no,则把#删除即可

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98404

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班