shell脚本学习——数组、变量、case语句、函数、制作跳板机

一、数组
1、普通数组:只能使用整数作为数组索引(元素下标)

数组名[索引下标]=值
marry[0]=n1
marry[1]=n2
marry[2]=n3
数组名=(值1 值2 值3 ...)
marry=(n1 n2 n3 ...)
marry1=(`cat /etc/passwd`)
marry2=(1 2 3 "hello world" [10]=linux)

数组的读取

${数组名[元素下标]}
echo ${marry[0]}   读取数组第一个元素
echo ${marry[*]}   读取数组所有元素
echo ${#marry[*]}   读取数组所有元素个数
echo ${!marry[*]}   读取数组元素的索引下标
echo ${marry[*]:1:2}  读取下标为1的元素开始,获取2个元素
declare -a   查看普通数组元素

2、关联数组:使用字符串作为数组索引(元素下标)

declare -A abc_marry1       查看关联数组元素
数组名[索引or下标]=变量值
abc_marry[linux]=one
abc_marry[java]=two
abc_marry2=([name1]=harry [name2]=jack [name3]=natasha)

二、dirname与basename

A=/root/tmp/shell/mem.txt
echo $A
/root/tmp/shell/mem.txt
dirname $A
/root/tmp/shell     提取目录
basename $A
mem.txt              提取文件名

变量内容的删除和替换

一个%代表从右往左去掉一个
两个%%代表从右往左最大去掉
一个#代表从左往右去掉一个
两个##代表从左往右最大去掉
url=www.baidu.com
echo ${#url}         13
echo ${url#*.}       baidu.com 
echo ${url##*.}      com
echo ${url%.*}       www.baidu
echo ${url%%.*}      www

练习
1、统计web服务不同连接状态个数

#!/bin/bash
declare -A array1
states=`ss -natp|grep :80|cut -d' ' -f1`
for i in $states
do
    let array1[$i]++
done
for j in ${!array1[*]}
do
     echo $j:${array1[$j]}
done

三、case语句
case语句为多重匹配语句
语法结构

case var in
pattern 1)
      command1
      ;;
pattern 2)
      command2
      ;;
pattern 3)
      command3
      ;;
            *)
      command4
      ;;
esac

例:
1、不同值执行不同动作

#!/bin/bash
case $1 in
              start|S)
              service apache start &>/dev/null && echo "启动成功"
              ;;
              stop|T)
              service apache stop &>/dev/null && echo "服务停止"
              ;;
              reload|R)
              service apache restart &>/dev/null && echo "服务重启"
              ;;
              *)
              echo "请输入动作..."
              ;;
esac

2、提示输入需求,执行动作

#!/bin/bash
read -p "请输入服务名称(vsftpd):" service
case $service in
           vsftpd|ftp)
           read -p "请选择执行动作(restart|stop):" action
           case $action in
                         stop|S)
                         service vsftpd stop &>/dev/null && echo "$service服务停止"
                         ;;
                         start)
                         service vsftpd start &>/dev/null && echo "$service服务成功"
                         ;;
           esac
           ;;
           httpd|apache)
           echo "apache is running..."
           ;;
           *)
           echo "请输入服务名称(vsftpd):"
           ;;
esac

3、菜单提示选择功能

#!/bin/bash
menu(){
cat <<-EOF
          h  显示命令帮助
          f  显示磁盘分区
          d  显示磁盘挂载
          m  查看内存使用
          u  查看系统负载
          q  退出程序
          EOF
}
menu
source fun.sh    #调用其他函数,先在此处source
while true
do
read -p "请选择操作内容(help h):" action
clear
menu
case $action in
         h|help)
         menu
         ;;
         f)
         lsblk
         ;;
         d)
         df -h
         ;;
         m)
         free -m
         ;;
         u)
         uptime
         ;;
         q)
         exit
         ;;
esac

四、函数
将一组命令集合或语句形成一段可用代码(函数)

方法一:
函数名()
{
    函数体(一堆命令的集合,实现具体功能)
}

方法二:
function 函数名()
{
    函数体(一堆命令的集合,实现具体功能)
}

vim fun.sh
#!/bin/bash
function menu()
{
cat <<-EOF
          h  显示命令帮助
          f  显示磁盘分区
          d  显示磁盘挂载
          m  查看内存使用
          u  查看系统负载
          q  退出程序
EOF
}

source fun.sh
menu

临时调用函数source
全局调用函数在/etc/bashrc
单个用户调用函数~/.bashrc

函数中的return:结束一个函数;默认返回函数最后一个命令状态值,可给定参数值,0~256;若无return,函数返回最后一个命令的退出状态值。

应用:收集用户输入信息,根据输入信息输出内容

#!/bin/bash
input_fun()
{
    input_var=""
    output_var=$1
    while [ -z $input_var ]
    do
    read -p "$output_var" input_var
    done
    echo $input_var
}
#调用函数
name=$(input_fun 请输入姓名:)
sex=$(input_fun 请输入性别:)
age=$(input_fun 请输入年龄:)
case $sex in
     man)
     if [$age -gt 18 -a $age -le 35 ];then
        echo "中年大叔"
     elif [ $age -gt 35 ];then
        echo "你老了!!!"
     else
        echo "你好,骚年!"
     fi
     ;;
     woman)
       echo "你好,美女!"
     ;;
     *)
       echo "外星人!"
     ;;
esac

综合练习
只允许yunwei用户通过跳板机登录服务器做维护

vim jump-server.sh
#!/bin/bash
menu()
{
cat <<EOF
欢迎使用jump-server,请选择主机:
1.DB1-Master
2.DB2-Slave
3.Web1
4.Web2
h.help
q.exit
EOF
}
trap : 1 2 3 19 20    #屏蔽非正常退出信号
menu
while true
do
read -p "请选择主机:" host
case $host in
         1|DB1)
         ssh [email protected]
         ;;
         2)
         ssh [email protected]
         h)
         menu
         ;;
         q)
         exit
         ;;
esac  
done   

#此脚本放在yunwei账户下:~/jump-server.sh
vim ~/.bashrc
#在最后添加
/home/yumwei/jump-server.sh
exit

你可能感兴趣的:(shell脚本学习,linux,shell)