unit-10--Bash-_scripts 2

第十单元--Bash-_scripts 2


一、位置参数

1.read
交互式输入
#!/binbash
read -p 'Enter your first and last name: ' FIRST LAST

2.Bash解析的个别参数或整个原始命令行。

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

二、退出状态

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

退出状态的含义:
0 – 在指定的文件中找到了模式
1 – 在指定的文件中未找到模式
>1 – 一些其他错误(无法打开文件、错误的搜索表达式等)

[root@foundation98 mnt]# sh file
[root@foundation98 mnt]# echo $?
0

三、test条件判断

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

1.非零或零长度字符串运算符:test -{n|z} STRING 或 [ -n|-z STRING ]
-n 是否不为空;
-z 是否为空
[root@foundation98 mnt]# test -n westos ;echo $?
0
[root@foundation98 mnt]# test -z westos ;echo $?
1
[root@foundation98 mnt]# [ -n westos ];echo $?
0
[root@foundation98 mnt]# [ -z westos ];echo $?
1

2.字符串比较运算符:=【相等】、!=【不等】
[root@foundation98 mnt]# [ abc = ABC ] ; echo $?
1
[root@foundation98 mnt]# [ abc = abc ] ; echo $?
0
[root@foundation98 mnt]# [ abc != abc ] ; echo $?
1
[root@foundation98 mnt]# [ abc != ABC ] ; echo $?
0

3.数字比较运算符:-eq【等于 】、-ne【不等】、-lt【小于】、-le【小于等于】、-gt【大于】、-ge【大于等于】
[root@foundation98 mnt]# [ 1 -eq 1 ] ; echo $?
0
[root@foundation98 mnt]# [ 2 -lt 1 ] ; echo $?
1
[root@foundation98 mnt]# [ 2 -gt 1 ] ; echo $?
0
[root@foundation98 mnt]# [ 2 -ge 2 ] ; echo $?
0
[root@foundation98 mnt]# [ 2 -le 2 ] ; echo $?
0

4.文件状态运算符:test -{b|c|e|f|d|r|w|x|s|S|L} FILE/DIRECTORY
-b 是否为block 文件;
-c 是否为字符设备文件;
-e 是否存在;
-f 是否是文件;
-d 是否是目录;
-s 是否不为空文件;
-S 是否为socket文件;
-L 是否为软链接文件;
-r 是否可读;
-w 是否可写;
-x 是否可执行
[root@foundation98 mnt]# [ -f /etc/passwd ] ; echo $?
0
[root@foundation98 mnt]# [ -b /dev/pts/0 ] ; echo $?
1
[root@foundation98 mnt]# [ -c /dev/pts/0 ] ; echo $?
0
[root@foundation98 mnt]# [ -x /etc/passwd ] ; echo $?
1
[root@foundation98 mnt]# [ -w /etc/passwd ] ; echo $?
0
[root@foundation98 mnt]# [ -r /etc/passwd ] ; echo $?
0
[root@foundation98 mnt]# [ -s  /etc/passwd ] ; echo $?
0

5.二进制文件运算符:-ef、-nt、-ot
-ef 文件1与文件2是否设备和字符相同;
-nt 文件1是否新于文件2(建立时间);
-ot 文件1是否老于文件2;
[root@foundation98 mnt]# ln -s /etc/passwd .    ##建立/etc/passwd的软链接文件到/mnt
[root@foundation98 mnt]# ll
total 0
lrwxrwxrwx 1 root root 11 Jun 20 10:25 passwd -> /etc/passwd
[root@foundation98 mnt]# [ /mnt/passwd -ef /etc/passwd ] ; echo $?    ##/etc/passwd 是否与/mnt/passwd相同,因为是链接,所以指向的全部为同一个文件,所以是相同的
0
[root@foundation98 mnt]# [ /mnt/passwd -nt /etc/passwd ] ; echo $?    ##/mnt/passwd是否新于/etc/passwd,因为是链接文件,所以指向为同一文件,故而建立时间相同
1
[root@foundation98 mnt]# touch file
[root@foundation98 mnt]# [ /mnt/passwd -ot /mnt/file ] ; echo $?    ##/mnt/passwd是否老于/mnt/file
0
[root@foundation98 mnt]# [ /mnt/passwd -nt /mnt/file ] ; echo $?
1

6.逻辑运算符:-o、-a、!、&&、||
[root@foundation98 mnt]# [ 2 -gt 1 -a 3 -gt 1 ] ; echo $?  ##条件1与条件2与
0
[root@foundation98 mnt]# [ 2 -gt 1 -o 3 -lt 1 ] ; echo $?    ##条件1和条件2或
0
[root@foundation98 mnt]# [ ! " 2 -gt 1 -o 3 -lt 1" ] ; echo $?
1    ##条件1或条件2的总的非
[root@foundation98 mnt]# [  3 -gt 1 ]&&  echo OK || echo NO
OK    ##3是否大与1,如果是输出OK,如果不是输出NO

四、if语句

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

语法:if command; then command; command2; else command3; fi
实例:
[root@foundation98 mnt]# if [ "root" = "westos" ] ;then echo "They are equal"; else echo "They are not equal"; fi
They are not equal
[root@foundation98 mnt]# if [ "root" = "root" ] ;then echo "They are equal"; else echo "They are not equal"; fi
They are equal

五、case 语句


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

实例:脚本实现加减乘除
#!/bin/bash
read -p "Please input you choice [+|-|*|/] " SUANFA
read -p "Please input two numbers [ NUM1 NUM2 ]: " NUM1 NUM2

case "$SUANFA" in
        \+)
                echo $[$NUM1+$NUM2]
                ;;
        \-)
                echo $[$NUM1-$NUM2]
                ;;
        \*)
                echo $[$NUM1*$NUM2]
                ;;
        \/)
                echo $[$NUM1/$NUM2]
                ;;
esac

测试:
[root@foundation98 mnt]# sh case.sh
Please input you choice [+|-|*|/]:  +
Please input two numbers [ NUM1 NUM2 ] :  1 1
2
[root@foundation98 mnt]# sh case.sh
Please input you choice [+|-|*|/]:  -
Please input two numbers [ NUM1 NUM2 ] :  1 1
0
[root@foundation98 mnt]# sh case.sh
Please input you choice [+|-|*|/]:  *
Please input two numbers [ NUM1 NUM2 ] :  1 1
1
[root@foundation98 mnt]# sh case.sh
Please input you choice [+|-|*|/]:  /
Please input two numbers [ NUM1 NUM2 ] :  2 1
2

六、expect 语句


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

实例:
写.sh脚本建立问答式脚本
示图:sh脚本文件



下载安装expect插件
yum install expect

建立.exp 文件实现自动问答
#!/usr/bin/expect        ##这一行告诉操作系统脚本里的代码用哪一个shell来执行
spawn /mnt/Q.sh            ##spawn是expect的内部命令,作用是给后面的shell指令加个壳,用来传递交互指令。
expect "Who"            ##判断上次输出结果里是否包含“who”的字符串,如果有则立即返回,否则等待超时时间后返回
send "Lori\r"            ##执行交互动作,相当于手工输入"Lori"。
expect "Where"
send "School\r"
expect "How"
send "tired\r"
expect eof            ##作用是在输出中搜索文件结束符,如果没有这一行,脚本会立即退出,得不到正确结果

其他命令参数:
set timeout 10            ##设置后面所有的expect命令的等待响应的超时时间,单位为秒。
interact            ##执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。否则退出登录。
$argv 参数数组            ##expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数。

测试:
[root@foundation98 mnt]# chmod +x A.exp
[root@foundation98 mnt]# expect A.exp
spawn /mnt/Q.sh
 Who are you ?Lori
 Where are you ?School
 How are you ?tired
 I am Lori ,being in School  , feeling tired

七、环境变量


shell和脚本使用变量来存储数据 ,有些变量可以连同它们的内容传递给子进程,这些变量我们称之为环境变量

使用env命令显示所有环境变量
使用set命令现实所有本地定义的shell变量

1.临时变量--只限于当前bash中
[root@foundation98 mnt]# X=2
[root@foundation98 mnt]# echo $X
2
[root@foundation98 mnt]# exit
logout
[kiosk@foundation98 Desktop]$ echo $X
[kiosk@foundation98 Desktop]$ PS1='lalala >'
lalala >ls
bash_scripts-2.sh  rh254test.sh         rht-server.desktop
pxe.sh             rht-desktop.desktop
lalala >

2.变量只限于在某用户下生效使用,其他用户无效
用户自定义变量文件 ~/.bash_profile 去初始化它们的环境变量
alias命令可以用来自定义属于自己的系统命令,写入~/.bashrc 文件永久生效
[kiosk@foundation98 ~]$ vim ./bashrc
示图:修改文件内容

[kiosk@foundation98 ~]$ xie file


3.变量全部都可以使用【当与指定用户使用的变量设置相冲突时,哪一个变量最先设定,哪一个生效】

在用户登录的时候,会运行全局变量文件/etc/profil
alias命令可以用来自定义系统命令,写入/etc/bashrc 文件永久生效
[root@foundation98 ~]# vim /etc/bashrc
示图:修改内容

[root@foundation98 mnt]# exit
logout
[kiosk@foundation98 ~]$ xie file

alias 使用
alias         ##查看别名
alias mycom='echo hello;hostname'    ##设置别名
unalias mycomm    ##删除别名

八、使用函数


函数名(){
    command1
    command2
    ...
    commandN
    [return value]        
}

##函数返回值可以增加return语句,如果不加,则将最后哦欧一条运行结果作为返回值(一般为0,如果执行失败则返回错误代码)。return后跟数值0-255

实例:
示图:脚本内容


测试:

[root@foundation98 mnt]# sh hanshu.sh
Welcome to a new shell!

###  练习题  ###

1. 1分10秒倒计时

脚本:



执行结果:


2. 查看指定IP
#!/bin/bash
read -p  "please inuput the interface: " INTERFACE
echo `cat /etc/sysconfig/network-scripts/ifcfg-${INTERFACE} | awk -F "IPADDR" '{print $2}'`

[root@foundation98 mnt]# sh ip.sh
please inuput the interface: br0
0=172.25.254.98 1=172.25.98.250

3. 查看用户是否启动
脚本内容:

测试:

4. 查看文件类型
脚本内容:

测试:

5. 查看两数字之和是否在10以内
脚本:

测试:

6.建立用户及设定密码(密码为用户名),同时可以删除用户
脚本内容:

测试:

7.查看用户主机名

ssh.sh脚本


ssh.exp脚本



测试:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值