Shell 脚本学习

Shell 脚本学习

本文不详细讲解,理论和用法。希望通过几个Shell脚本案例快速上手Shell脚本的编写

参考

基本使用方法

变量的声明

变量名=变量值

删除变量

unset 变量名

将命令的输出赋值给变量

变量名=`command`

与输入输出有关的文件描述

文件描述符文件名类型硬件
0stdin标准输入文件键盘
1stdout标准输出文件显示器
2stderr标准错误输出文件显示器

$…的作用

符号说明
$$Shell 本身的PID
$!Shell 最后运行的后台Process的PID
$?最后运行的命令的结束代码(返回值),即执行上一条指令的返回值(显示最后命令的退出状态。0表示没有错,其他任何值表明有错误)
$-使用Set命令设定Flag一览
$*所有参数列表
$@所有参数列表
$#添加到Shell 的参数个数
$0Shell本身的文件名
$1- $n添加到Shell的各参数值,序号表示第几个参数

-…的作用

文件表达

符号说明
-e filename如果filename存在,则为真
-d filename如果filename为目录,则为真
-ffilename 为常规未见,则为真
-Lfilename 为符号链接,则为真
-rfilename 可读,则为真
-wfilename 可写,则为真
-xfilename 可执行,则为真
-sfilename 文件长度不为0,则为真
-h如果文件是软链接,则为真

整数变量表达式

符号说明
-eq等于
-ne不等于
-gt大于
-ge大于等于
-lt小于
-le小于等于

案例

文件读入数据实现赋值

#! /bin/bash
ls *.c > execfile
while read LINE
do
        chmod +x ${LINE}
done<execfile

这个程序表明从execfile中读入数据,并将循环得到的每行数据赋值给变量LINE。然后将其中的每个以.c结尾的文件赋予可执行权限。

多进程测试网段中哪些主机处于开机状态

while 版本

#!/bin/bash

clear_file(){
  cat /dev/null > iplog.txt
}

i=1
MaxRange=20

clear_file
while [ $i -le ${MaxRange} ]
do  
  ping -c 2 -i 0.3 -W 1 192.168.4.${i} &>/dev/null
  if [ $? -eq 0 ];then
  echo "192.168.4.${i}" >> iplog.txt
  else
  echo "192.168.4.${i} is down"
  fi
  let i++
done

这里比较费解的就是 $?,代表的其实就是上一条指令的返回值(显示最后命令的退出状态,0表示没有错误,其他任何值表明有错误)。

这样其实就好理解上面这段脚本的运作原理了。

多进程版本

#!/bin/bash

clear_file(){
  cat /dev/null > iplog.txt
}

i=1

myping(){
  ping -c 2 -i 0.3 -W 1 $1 &>/dev/null
  if [ $? -eq 0 ];then
    echo "${1} is up"
  else
    echo "${1} is down"
  fi
}

for i in {1..20}
do
  myping 192.168.4.${i} &
done

使用&符号,将执行的函数放入后台执行

这样做的好处就是不需要等待ping第一台主机的回应,就可以继续并发ping第二台主机,依次类推。

可以观察运行的输出多进程版本明显快于单进程版本

查看有多少远程的IP在连接本机

#!/bin/bash

#查看有多少远程的 IP 正在连接本机(不管是通过 ssh 还是 web 还是 ftp都统计)
#使用 ``netstat -atn`` 可以查看本机所有连接的状态,-a 查看所有
#-t 仅显示 tcp 连接的信息, -n 数字格式显示
#Local Address (第四列是本机的IP和端口信息)
#Foreign Address (第五列是远程主机的IP和端口信息)
#使用awk 命令仅显示第5列数据, 再显示第 1 列 IP 地址的信息
#sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复的次数
netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c

打印国际象棋棋盘

#!/bin/bash

printChess(){
  #打印国际象棋棋盘
  #设置两个变量 i、j 分别代表行和列
  #棋盘的规则其实就是相邻的不同颜色
  #使用echo -ne 打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块 
  
  for i in {1..8}
  do
    for j in {1..8}
    do
      sum=$[i+j]
      if [ $[sum%2] -eq 0 ];then
        echo -ne "\033[46m \033[0m"
      else
        echo -ne "\033[47m \033[0m"
      fi
    done
    echo
  done
}
printChess

image-20221103124235538

模拟程序启动时选择模式

#!/bin/bash

# programRunning
checkNumber(){
  case $1 in
  start)
    echo "starting"
    ;;
  stop)
    echo "stoping"
    ;;
  test)
    echo "is testing"
    ;;
  *)
    echo "Usage: {start|stop}"
    ;;
  esac
}

a=
read -p "please select option: " a
checkNumber $a

获得任务运行的PID

#!/bin/bash

PID=
get_pid(){
    PID=`ps -ef | grep root | grep ywh | awk '{print $2}'`
}
get_pid
echo $PID
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值