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

(0)
晨嘉晨嘉
上一篇 2018-05-13
下一篇 2018-05-13

相关推荐

  • 磁盘及文件系统管理(二)

    简要概括磁盘及文件系统管理

    Linux笔记 2018-05-13
  • 网络管理基础

    1.PDU: Protocol Data Unit,协议数据单元是指对等层次之间传递的数据单位 物理层的 PDU是数据位 bit 数据链路层的 PDU是数据帧 frame 网络层的PDU是数据包 packet 传输层的 PDU是数据段 segment 其他更高层次的PDU是消息 message 2.TCP特性工作在传输层 面向连接协议 全双工协…

    Linux笔记 2018-05-02
  • fstab、init文件创建,内核启动管理

    /etc/下的fstab文件和/sbin/下的init文件的创建,内核启动列表管理简述

    2018-05-15
  • 运维之ansible

    运维工作:系统安装(物理机、虚拟机)–> 程序包安装、配置、服务启动 –> 批量操作 –> 程序发布  –> 监控 稳定可用     ——-      标准化            ———        自动化 系统安装: 1、…

    2018-07-16
  • 标准I/O

    标准输入,标准输出,标准错误

    2018-04-14
  • 第四周Linux小总结

    sed工具;用法: sed [option]… ‘script’ inputfile…常用选项:-n:不输出模式空间内容到屏幕,即不自动打印[root@localhost ~]# sed -n -e “2p” -e “6p” f1 (2;6代表处理第几行)-e: …

    Linux笔记 2018-04-22