3-unit12 脚本2

简介:

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

**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 $?        ##westos非零
0
[root@server0 ~]# [ -z westos ]; echo $?        ##westos等于零
1


wKiom1lHxNCihK1VAAGV8jwqYKU241.png

wKioL1lHxNKwqYOiAAC1W43N3JI934.pngwKiom1lHxNzAFjmZAAEr2wt1t7s027.png

##测试:

wKioL1lHxNnT3EwnAAIDuIfaZek563.png


    ####字符串比较运算符:=、!=
[root@server0 ~]# [ abc = abc ]; echo $?          ##相等
0
[root@server0 ~]# [ abc = ABC ]; echo $?        
1
[root@server0 ~]# [ abc != ABC ]; echo $?        ##不等于
0
 
wKioL1lHxN7jNfVlAAHZsqN858A216.png


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

##-ge   大于等于

##-le    小于等于

##-lt    小于

[root@server0 ~]# [ 1 -eq 1 ]; echo $?    ##等于
0
[root@server0 ~]# [ 1 -ne 1 ]; echo $?    ##不等
1
[root@server0 ~]# [ 1 -gt 2 ]; echo $?     ##大于
1

wKiom1lHxN_Ck-X9AAJO14R3v6A108.png

wKioL1lHxN-yAK4kAAGJwmFuu6k539.png

wKiom1lHxOHBw6TxAAJ1--T70Qs669.png



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

##-s 判断文件是空文件

##-S 判断文件是套字节

##-x 判断文件是可执行文件

                                                                                                        

[root@server0 ~]# [ -b /dev/sda ]; echo $?             ##-b 判断文件是块设备

1
[root@server0 ~]# [ -c /dev/zero ]; echo $?            ##-c 判断文件是字符设备

0
[root@server0 ~]# [ -e /etc/passwd ]; echo $?        ##-e 判断文件是否存在

0
[root@server0 ~]# [ -f /etc/passwd ]; echo $?         ##-f 判断文件是文件
0
[root@server0 ~]# [ -d /etc/passwd ]; echo $?        ##-d 判断文件是目录
1
[root@server0 ~]# [ -L /etc/passwd ]; echo $?        ##-L 判断文件是链接
1

wKioL1lHxOLTO8P4AAMGvGFHJnY190.png

wKioL1lHxOSgL2ztAAJ7d2NflXg529.png

wKiom1lHxOXxecuJAAK73enLxJE558.png


#####二进制文件运算符:-ef、-nt、-ot
[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 $?    ##2大于1并且1大于2
1
[root@server0 bin]# [ 2 -gt 1 -o 1 -gt 2 ]; echo $?    ##2大于1或者1大于2
0
[root@server0 bin]# [ ! 2 -gt 1 ]; echo $?                ##(2大于1)取反
1


######if语句
if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之间的命令列表(反向平写if,标记if块的结束)。
语法:if command; then command; command2; else command3; fi
示例:
if test “$USER” != 'root' ; then
echo you are not logged in as root
fi
if [ $(id -u) -lt 9 ] ; then
echo “The number $(id -u) is less than 9!”
fi

if grep “^${USER}:” /etc/passwd &> /dev/null ; then
echo “${USER} is a local user on the system.”
else
echo “${USER} is not a local user.”
fi
systemctl is-active mariadb > /dev/null 2>&1 ; MARIADB_ACTIVE=$?
systemctl is-active postgresql > /dev/null 2>&1 ; POSTGRESQL_ACTIVE=$?
if [ $MARIADB_ACTIVE -eq 0 ];then
mysql
elif [ $POSTGRESQL_ACTIVE -eq 0 ];then
psql
else
sqlite3
fi


wKiom1lHxOawr_ZyAAFH2dZ4vUo881.png

wKioL1lHxOfTPclAAAFbnuqE5sw411.png

wKiom1lHxOjiao0aAAEYyukR_b0125.png

wKioL1lHxOixKnVfAAHz1svFbMY929.png

wKiom1lHxOmASesrAAIaHoDhwmY544.png

wKioL1lHxOrThHeoAAIer4ABQlc334.png


调用函数:

wKiom1lHxYaBCtKOAADxJRWxy5o102.png

wKiom1lHxYmQ8z1VAADZ4hnv5n4263.png

wKioL1lHxZaRnRyDAAEOyW1nLrE329.png

测试:

wKiom1lHxZKBx3Z9AALPbqEbsUM260.png


#########case语句######
case语句 :它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪部分代码。
case "$1" in
start)
systemctl start $2
;;
stop)
systemctl stop $2
;;
reload|restart)
systemctl stop $2
systemctl start $2
;;
*)
echo "Usage: $0 (start|stop|restart|reload)"
;;
esac


######expect语句#######
在shell中利用expect实现自动应答脚本。
# cat talk
echo "who are you?"
read who
echo "hello, $who"
echo "are you
happy?"
read answer
echo "why?"
read answer

wKiom1lHxZiRBgPQAACjiLHO2gc863.png


# cat auto
#!/usr/bin/expect
#set timeout 10
spawn ./talk
expect "who"
send "firefly\n"
expect "happy?"
send "Yes,I am happy.\n"
expect "why?"
send "任性!\n"
expect eof
exit

解释:

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

wKiom1lHxOrj2gyHAAEnd97M1pg069.png

测试:

wKioL1lHxOuSkaz4AAGIXnFwZkM070.png

wKiom1lHxOyTMye-AAIQiZF7OiI544.png

测试:wKioL1lHxO3xOO-6AAI-xyaJwSM320.png

wKiom1lHxO6R5pgvAAIeIpYgKME863.png

wKioL1lHxO_gDZiGAAEZhKEv1EE251.png

wKiom1lHxPCSwHeGAAFZVpb1gb4116.png

测试:

wKioL1lHxPGR2tHYAAMIZhrix4A040.png

####查询1号主机用户名

wKioL1lHxPLjNZRcAAFBbTtQKWk566.png

wKiom1lHxPPR7bFjAAGcx-_V4SA667.png


wKiom1lHxPSRwlW-AAItDuzBXpk410.png

测试:查询1号和100号主机的用户名

wKioL1lHxPWj2JJLAANPeUho9FY615.png

wKioL1lHxPbAVMstAAI1rp-KOmc945.png

测试:wKiom1lHxTqCqJtJAAC5vDVNI38593.png

wKiom1lHxTvTezSyAAKL0LR8k9Y901.png

wKioL1lHxT3RQU_mAAKnNR_hKmQ439.png

测试;

wKioL1lHxTywOaIUAAFXSdhGNq4663.png

wKiom1lHxT_RFV76AADoVJJAWS8305.png

wKioL1lHxUeRBjecAAJL6rh1fgk537.png

测试:查询cpu利用率

wKiom1lHxVyT8EI0AAZV6EWwD7U669.png



########环境变量#######
shell和脚本使用变量来存储数据 ,有些变量可以连同它们的内容传递给子进程,这些
变量我们称之为环境变量。
[root@server0 ~]# LINUX=redhat
[root@server0 ~]# echo $LINUX
redhat
[root@server0 ~]# bash
[root@server0 ~]# echo $LINUX
[root@server0 ~]# exit
exit
[root@server0 ~]# export LINUX
[root@server0 ~]# bash
[root@server0 ~]# echo $LINUX
redhat
[root@server0 ~]# exit
exit




#####使用env命令显示所有环境变量#######
使用set命令现实所有本地定义的shell变量
Bash启动脚本
在用户登录的时候,会运行全局变量文件/etc/profile,和用户自定义变量文件
~/.bash_profile去初始化它们的环境变量。
/etc/profile
\_ /etc/profile.d/*.sh
~/.bash_profile
\_ ~/.bashrc
\_ /etc/bashrc

wKiom1lHxXDzD_AvAAWdHmfj2fY827.png

wKioL1lHxXuQrinNAARpK3kjQrE167.png


.bash_profile用户环境变量文件:

wKioL1lIhCvClhx8AAAtyPUgnYY876.png

wKioL1lIhCuy9LWnAADueWCqVJc670.png

wKioL1lIhKCD9ggbAAI5GQGxObg173.png

/etc/profile系统环境变量


wKioL1lIhDKzGVf0AADIOolyK6E099.png

root用户启动时先读系统再读用户文件


wKiom1lIhkKzUs_CAALN0Jl0qCY428.png





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

wKiom1lIgrahqE40AAGcyJhuYlw968.png

wKiom1lIgrWTaOSqAACswn_aVT8334.pngwKioL1lIgrWiqJGeAAMlLryMy4Y711.png
删除别名: unalias mycomm

wKioL1lIgr7hOLzUAAMXv9i_vrY215.png


使用函数
pathmunge () {
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
}
...
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi

wKioL1lHxYPzsPNuAAKWKD30Src814.png



本文转自cuijb0221 51CTO博客,原文链接:http://blog.51cto.com/cuijb/1940048


相关文章
|
测试技术 程序员
loadrunner 运行脚本-Run-time Settings-ContentCheck简单设置
loadrunner 运行脚本-Run-time Settings-ContentCheck简单设置
67 0
|
测试技术
loadrunner 运行脚本-Run-time Settings之Pacing设置
loadrunner 运行脚本-Run-time Settings之Pacing设置
143 0
|
Linux 开发工具
|
Linux Shell 开发工具
|
Shell 数据安全/隐私保护
|
网络协议 开发工具
|
监控 Unix 开发工具