shell常用脚本

服务器

浏览数:160

2019-11-2

shell 变量? 用一个固定的字符串去表示不固定的内容,便于修改。
变量的类型:
1、自定义变量

1)定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115
引用变量: {变量名}
查看变量: echo $变量名; “set”可以查看所有变量(包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前shell中有效

2)变量赋值(显示赋值、隐示赋值) read 从键盘读入变量值
read 变量名
read -p “提示信息: ” 变量名
read -t 5 -p “提示信息: ” 变量名 //-t 等待5秒,后超时
read -n 2 变量名 //-n 只记录几个字符

2、环境变量

定义环境变量: 方法一 export name=zhutong
方法二 export name 将自定义变量转换成环境变量
引用环境变量: {变量名}
查看环境变量: echo $变量名 env 例如env |grep back_dir2
取消环境变量: unset 变量名
变量作用范围: 在当前shell和子shell有效 ! (使变量开机、登陆生效,将变量放到~/.bash_profile)

3、位置变量 预先定义过的变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值 0表示成功
4. 请用shell脚本实现:批量添加5个用户,用户名为:user1-5,密码为:user名+3个随机字符
#!/bin/bash
for i in {1..5}
do
  b=`openssl rand -hex 2`
  a=`echo $b|cut -c 1-3`
  useradd user$i
  echo user$i$a |passwd --stdin user$i
  echo "password is user$i$a"
done
5.统计重复出现的个数 比如ip访问量
cat /var/log/messages |awk '{ip[$1]++}END{for (i in ip)print ip[i] i}'|sort -k2 -rn
cat /var/log/messages |awk '{print $1}'|uniq -c|sort -k1 -rn

image.png

案例1:使用数组统计登陆shell的数量

数组 shells

取索引号  shells[$type]  ##$i为数组元素
#!/bin/bash
declare -A shells  ##声明数组
while read line 
do
        type=`echo $line |awk -F: '{print $7}'`
        let shells[$type]++    ##往shells数组添加元素,相同的元素添加索引号会加一
done <  /etc/passwd

for i in ${!shells[@]}   ##取出shells数组的所有元素索引号
do
        echo "$i  :: ${shells[$i]}"  ##利用索引号打印所有数组
done
执行结果
[root@localhost ~]  sh sex.sh 
/sbin/nologin  :: 21
/bin/sync  :: 1
/bin/bash  :: 17
/sbin/shutdown  :: 1
/sbin/halt  :: 1
[root@localhost ~]# 

案例2:使用数组统计文件中某一列的信息

示例文件:(统计文件中性别各有多少人,利用数组很方便)

[root@localhost ~]   vim sex.txt 
tom man
alice man
jion women
tom man
alice man
jion women
dfafa man
wewfw women
tom man
alice man
jion women
dfafa man
wewfw women
tom man
alice man
jion women
dfafa man
wewfw women
dfafa man
tom man
alice man
jion women
dfafa man
wewfw women
wewfw women

脚本文件:
[root@localhost ~]  vim sex.sh
#!/bin/bash
declare -A sex
while read line
do
    type=`echo $line |awk '{print $2}'`
    let sex[$type]++
done < sex.txt

for i in ${!sex[*]}
do
    echo "$i+++ ${sex[$i]}"
done
执行结果
[root@localhost ~]    sh test.sh 
women+++ 10
man+++ 15

作者:朱溪江