Bash scripts-II

来源:互联网 发布:淘宝网页版登录首页 编辑:程序博客网 时间:2024/05/17 22:50

Bash脚本条件判断和控制流结构

Bash位置参数

有两种简单的方法可以将用户输入读入bash中的变量。第一个方法是使用read提示用
户输入(使用-p选项)并将其直接存储到一个或多个变量:
交互式输入

read -p 'Enter your first and last name: ' FIRST LAST

另一个方法是使用位置参数来读取传递给脚本的命令行参数或选项输入。各种特殊
变量存储传递的选项编号
Bash解析的个别参数或整个原始命令行。

指定的位置参数总数:$#位置参数自身:$0、$1、$2、$3....所有位置参数: $@、$*

这里写图片描述

退出状态

Linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash
当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。

例如:grep的退出状态的含义:0 – 在指定的文件中找到了模式1 – 在指定的文件中未找到模式>1 – 一些其他错误(无法打开文件、错误的搜索表达式等)推出状态的值被存储在"?"中,可以使用以下命令查看:# echo $?

这里写图片描述
这里写图片描述
test条件判断
test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式
为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语
法,使用方括号”[]”将表达式括起来,这样更易于阅读。

语法:test EXPRESSION 或 [EXPRESSION]非零或零长度字符串运算符:test -{n|z} STRING[root@server0 ~]# [ -n westos ]; echo $?      ## -n 判断字符串是否不为空 不为空返回00[root@server0 ~]# [ -z westos ]; echo $?      ## -z 判断字符串是否为空 为空返回01

这里写图片描述

字符串比较运算符:=、!=

[root@server0 ~]# [ abc = abc ]; echo $?      ##字符串相同0[root@server0 ~]# [ abc = ABC ]; echo $?1[root@server0 ~]# [ abc != ABC ]; echo $?     ##“!”表示非 “!=”表示不相同0

这里写图片描述

数字比较运算符:-eq、-ne、-lt、-le、-gt、-ge

##-eq 相等、 -ne 不相等、 -lt 小于、 -le 小于或等于、 -gt 大于、 -ge 大于或等于[root@server0 ~]# [ 1 -eq 1 ]; echo $?0[root@server0 ~]# [ 1 -ne 1 ]; echo $?1[root@server0 ~]# [ 1 -gt 2 ]; echo $?1

这里写图片描述

文件状态运算符:test -{b|c|e|f|d|r|w|x|s|L} FILE/DIRECTORY

-b file检测文件是否是块设备文件,如果是,则返回 true-c file检测文件是否是字符设备文件,如果是,则返回 true-d file检测文件是否是目录,如果是,则返回 true-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true-g file检测文件是否设置了 SGID 位,如果是,则返回 true-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true-p file检测文件是否是有名管道,如果是,则返回 true-u file检测文件是否设置了 SUID 位,如果是,则返回 true-r file检测文件是否可读,如果是,则返回 true-w file检测文件是否可写,如果是,则返回 true-x file检测文件是否可执行,如果是,则返回 true-s file检测文件是否为空(文件大小是否大于0),不为空返回 true-e file检测文件(包括目录)是否存在,如果是,则返回 true[root@server0 ~]# [ -b /dev/sda ]; echo $?1[root@server0 ~]# [ -c /dev/zero ]; echo $?0[root@server0 ~]# [ -e /etc/passwd ]; echo $?0[root@server0 ~]# [ -f /etc/passwd ]; echo $?0[root@server0 ~]# [ -d /etc/passwd ]; echo $?1[root@server0 ~]# [ -L /etc/passwd ]; echo $?1

这里写图片描述

二进制文件运算符:-ef、-nt、-ot

filename1 -nt filename2 如果 filename1 比 filename2 新,则为真  filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真filename1 -ge filename2 如果 filename1和filename2  指向相同的设备和节点,则为真[root@server0 bin]# [ /bin/mount -ef /usr/bin/mount ]; echo $?0[root@server0 bin]# [ /bin/mount -nt /usr/bin/mount ]; echo $?1[root@server0 bin]# [ /bin/mount -ot /usr/bin/mount ]; echo $?1

这里写图片描述

逻辑运算符:-o、-a、!、&&、||

[root@server0 bin]# [ 2 -gt 1 -a 1 -gt 2 ]; echo ?        ##-a 并且  
1  
[root@server0 bin]# [ 2 -gt 1 -o 1 -gt 2 ]; echo
? ##-o 或者
0
[root@server0 bin]# [ ! 2 -gt 1 ]; echo $? ##!取非
1
这里写图片描述

if语句

if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then
之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之
间的命令列表(反向平写if,标记if块的结束)。

语法:if command; then command; command2; else command3; fi示例:if test “$USER” != 'root' ; thenecho you are not logged in as rootfiif [ $(id -u) -lt 9 ] ; thenecho “The number $(id -u) is less than 9!”fi

这里写图片描述

case语句

case语句 :它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪
部分代码。

case "$1" instart)systemctl start $2;;stop)systemctl stop $2;;reload|restart)systemctl stop $2systemctl start $2;;*)echo "Usage: $0 (start|stop|restart|reload)";;esac

这里写图片描述

expect语句

在shell中利用expect实现自动应答脚本。

#!/usr/bin/expect#set timeout 10spawn ./talkexpect "who"send "firefly\n"expect "happy?"send "Yes,I am happy.\n"expect "why?"send "任性!\n"expect eofexit
#!/usr/bin/expect这一行告诉操作系统脚本里的代码使用那一个shell来执行。set timeout 10设置后面所有的expect命令的等待响应的超时时间,单位为秒。spawn talkspawn是expect的内部命令,作用是给后面的shell指令加个壳,用来传递交互指令。expect "who"判断上次输出结果里是否包含“who”的字符串,如果有则立即返回,否则等待超时时间后返回。send "westos\n"执行交互动作,相当于手工输入"westos"。expect eof作用是在输出中搜索文件结束符,如果没有这一行,脚本会立即退出,得不到正确结果。interact执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。否则退出登录。$argv 参数数组expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数。

环境变量

shell和脚本使用变量来存储数据 ,有些变量可以连同它们的内容传递给子进程,这些变量我们称之为环境变量。[root@server0 ~]# LINUX=redhat[root@server0 ~]# echo $LINUXredhat[root@server0 ~]# bash[root@server0 ~]# echo $LINUX[root@server0 ~]# exitexit[root@server0 ~]# export LINUX[root@server0 ~]# bash[root@server0 ~]# echo $LINUXredhat[root@server0 ~]# exitexitwww.westos.org14使用env命令显示所有环境变量使用set命令现实所有本地定义的shell变量Bash启动脚本在用户登录的时候,会运行全局变量文件/etc/profile,和用户自定义变量文件~/.bash_profile去初始化它们的环境变量。/etc/profile\_ /etc/profile.d/*.sh~/.bash_profile\_ ~/.bashrc\_ /etc/bashrc

使用别名

alias命令可以用来自定义属于自己的系统命令,写入~/.bashrc 文件永久生效。查看别名:# aliasalias ls='ls --color=auto'alias mv='mv -i'alias rm='rm -i'...设置别名:# alias mycom='echo hello;hostname'# mycommhelloserver0.example.com删除别名: unalias mycomm

使用函数

pathmunge () {if [ "$2" = "after" ] ; thenPATH=$PATH:$1elsePATH=$1:$PATHfi}...if [ "$EUID" = "0" ]; thenpathmunge /usr/sbinpathmunge /usr/local/sbinelsepathmunge /usr/local/sbin afterpathmunge /usr/sbin afterfi
原创粉丝点击