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 18:10
下一篇 2018-05-13 18:49

相关推荐

  • centos6启动流程

    不知道为什么编辑了前两次都发不了,这是第三次了

    Linux笔记 2018-05-13
  • 手把手系列(二)教你搭建自己的yum源服务器

    通过yum安装程序包最重要的一步就是指定yum仓库,今天我来教大家如何搭建自己的yum源服务器。

    2018-04-20
  • LINUX磁盘管理笔记

    磁盘组成:扇区 sector          磁头  head 柱面 cylinder就是磁道相同序列的和 磁道  track 硬盘使用步骤: a.分区 b.创建文件系统;格式化 c.挂载;分配目录名   a.分区: 意义: a、优化i/o性能 ;b、提高修复速度 ;c、隔离系统和程序 d、安装多个OS  e、使用不同的文件格式 按柱面分区有两种…

    Linux笔记 2018-04-29
  • 进程和计划管理

    进程 进程是运行中的程序。每个程序启动后都会创建一个或多个程序。 常用查看进程的命令 ps 默认只查看当前用户终端中打开的进程 ps aux 显示所有进程信息,包括非终端登录以及其他终端、用户打开的进程 top 在当前终端以交互式方式显示进程排名,及时跟踪CPU、内存等系统资源的使用情况,默认三秒刷新一次。 P键:根据CPU占用情况对进程进行排序 M键:根据…

    Linux笔记 2018-05-06
  • N30-bash特性以及Linux文件管理常用命令汇总

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 文件管理类命令:cat,tac,head,tail,more,less 分屏查看命令:more,less more:more FILE特点,翻盘至文件尾部后自动退出 less FILE head:查看文件的前n行head [options] FILE-n 数字-数字 tail:查看…

    Linux笔记 2018-05-26
  • 软件包管理 2 —–基本知识 rpm yum

    rpm库文件查看二进制程序所依赖的库文件ldd /PATH/TO/BINARY_FILE管理及查看本机装载的库文件ldconfig 加载库文件/sbin/ldconfig -p:显示本机已经缓存的所有可用库文件名及文件路径映射关系配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf缓存文件:/etc/ld.so.cac…

    Linux笔记 2018-04-22