bash脚本基础(二)

来源:互联网 发布:directx9安装需要网络 编辑:程序博客网 时间:2024/05/29 10:02

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 $?

示例,判断文件是否存在:

#!/bin/bash

ls $1 &> /dev/null

[ "$?" -eq "0" ] && echo $1 is exist || echo $1 is not exist


test条件判断

test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式
为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语
法,使用方括号"[]"将表达式括起来,这样更易于阅读。
语法:test EXPRESSION 或 [EXPRESSION]
非零或零长度字符串运算符:test -{n|z} STRING
[root@server0 ~]# [ -n westos ]; echo $?
0
[root@server0 ~]# [ -z westos ]; echo $?
1

示例,测试输入的主机ip是否能连通,进行显示:

#!/bin/bash
test -n "$1"
while [ "$?" -eq "0" ]
do
        ping -c1 -w1 $1 &>/dev/null && echo up || echo down
        exit 1
done
echo please input IPADDRESS



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

[root@server0 ~]# [ abc = abc ]; echo $?
0
[root@server0 ~]# [ abc = ABC ]; echo $?
1
[root@server0 ~]# [ abc != ABC ]; echo $?
0


数字比较运算符:-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

示例,检查两个数字之和是否大于10:

#!/bin/bash
SUM=` expr $1 + $2 `
[ $SUM -le "10" ] && echo "SUM in 10" || echo "SUM not in 10"

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

[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

示例,检查输入文件的类型:

#!/bin/bash
while [ -z "$*" ]
do
    echo "please input a file"
    exit 1
done
    [ -e "$1" ] || (echo "file is not exit" ;exit 1)
        [ -c "$1" ] && echo "file is AsII"
        [ -b "$1" ] && echo "file is block"
        [ -f "$1" ] && echo "file is file"
        [ -d "$1" ] && echo "file is dir"
        [ -S "$1" ] && echo "file is socket"
        [ -L "$1" ] && echo "file is link"


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

-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、!、&&、||

-a    ##并且,两个条件同时满足
-o    ##或者,两个条件最少满足任意一个
!    ##给结果取反    

&&    ##结果正确执行

||    ##结果不正确执行

[root@server0 bin]# [ 2 -gt 1 -a 1 -gt 2 ]; echo $?
1
[root@server0 bin]# [ 2 -gt 1 -o 1 -gt 2 ]; echo $?
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

示例,建立文件中的用户,并初始密码为westos:


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实现自动应答脚本。

#!/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开始,分别表示第
一个,第二个,第三个....参数。

示例,实现自动登陆ssh:

1.安装expect软件

yum install expect

2.执行如下脚本:

示例,查看文件中对应ip的主机名:

示例,查看文件中对应ip的用户信息:



环境变量

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/p

rofile,和用户自定义变量文件
~/.bash_profile去初始化它们的环境变量。
/etc/profile
\_ /etc/profile.d/*.sh
~/.bash_profile
\_ ~/.bashrc
\_ /etc/bashrc





使用别名

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
删除别名: unalias mycomm



使用函数

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

示例,控制建立一个文件中的用户,并给其设置密码,用函数实现:


#!/bin/bash
ACTION(){
    if
    [ -z "$4" ]
    then
        echo "please give me a userfile"
    elif
    [ ! -e "$4" ]
    then
    echo "$4 is not exist!!"
    else
    for NAME in `cat $4`
    do
        USER=`getent passwd $NAME`
        if
        [ $1 "$USER" ]
        then
            $2 $NAME
            [ "$2" = "useradd" ]&&(echo westos |passwd --stdin $NAME)
        else
            echo $NAME  $3 !!
        fi
    done
    fi
}
if
[ "$1" = "create" ]
then
    ACTION -z 'useradd' 'is exist' $2
elif
[ "$1" = "delete" ]
then
    ACTION -n 'userdel -r' 'is not exist' $2
else
    echo "Usage :ctrl_user.sh <create|delete> <userfile>"
fi

示例,简化用函数查看文件类型: