【shell脚本】一些简单的shell脚本案例,mark一下

1、使用变量生成随机密码

比如自定义密码里面是数字和字母(或者还可以是某些符号等),随机生成一个想要的多少位的密码

[root@localhost test]#vim mima.sh
#!/bin/bash
str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPKRSTUVWXYZ0123456789"
for i in {1..6}
do
num=$[RANDOM%${#str}]
key=${str:num:1}
passwd=$key$passwd
done
echo "随机生成的六位数密码为:$passwd"

##随机密码,非常方便
echo `cat /dev/random|tr -dc [[:alnum:]]|head -c 6` 

2、将一个文件拆分两个或多个文件

假设有一个几千行的大文件,想要分割成多个100行的小文件,可以使用该脚本,虽然有split命令,看一下脚本实现

[root@localhost /test]#cat fenge.sh 
#!/bin/bash
##计划以换行为分隔符
IFS=$'\n'  ##这一步是必须要有的,否则默认是空格和换行一起为分隔符
#定义k变量充当为行计数器
k=0

i=1  #定义i变量充当自动分配给文件的累加序号
for line  in `cat /data/123.txt`  ##调用文件内容,可以是反引号,也可以是$(),获取cat命令查看输出结果
do
let k++   #每读一行,k累计加一
j=$[k%100] #这里的j变量来判断行数是否满足一百行
 		if [ $j  -eq  0  ];then  
  	echo $line >> /data/test"$i".txt   ##满足100行会将文件都重定向输入至test$i文件中
    let i++  ##但是因为是100行分割一次,所以变量i值记录有多少个100行,
  	else   ##等到满足了100行,i会加1,然后下一次会更换文件序号,后面再重定向记录到新的文件当中
    echo $line >>/data/test"$i".txt 
 		fi
done

IFS=$IFS_BAK   #还原默认分隔符,这里实际上也无所谓,因为本质上还是\n,并不是以特殊的符号为分隔符

3、将十进制的IP地址转化为二进制的IP地址

 
#!/bin/bash
 
read -p  "请输入一个ip地址:"  ip
a=1
b=0
while [  $a -le  4   ]
do
#取IP地址的“.”前面的首字段
  num=${ip%%.*}
  for i in {1..8}
  do
    var=$[num % 2]
    sum=$var$sum
    num=$[num / 2]
  done
#除去IP地址的首个字段,并将(除去首个字段的IP)重新赋值给变量
ip=${ip#*.}
let a++
echo -n  ${sum:0:8}
let b++
if [ $b -lt 4   ];then
   echo -n '.'
else
   break
fi
done
echo 

补充:可以使用bc计算器
echo "obase=2;ibase=10;128" | bc

echo "obase=2;256"|bc  ##默认是十进制数转化

补充:将255以内的数字变为二进制

#!/bin/bash
#把0~255的十进制整数转换成8位二进制数
read -p "请输入一个0~255的整数:" num
for i in 128 64 32 16 8 4 2 1
do
  NUM=$[num - i]
  if [ $NUM -lt 0 ]
  then 
    echo -n 0                   ##比i小则为0,echo -n为不换行输出
  else
    echo -n 1                   ##比i大则为1
    num=$[num - i]
  fi
done
echo                            ##换行

echo "obase=2;256"|bc  

采用bc计算器做进制转换

read -p "请输入一个0~255的整数:" i 
echo "obase=2;${i}"|bc    ##默认是十进制数转化
echo "obase=2;ibase=10;${i}"|bc    ##默认是十进制数转化

补充:取余数,把255以内的数字变为二进制

#!/bin/bash
read -p  "请输入一个0-255的整数:"  num 
for i in {1..8}
do
    var=$[num % 2]
    sum=$var$sum
    num=$[num / 2]
done
echo $sum

4、检测重要文件是否发生改变

[root@localhost xh]#vim md5.sh 
#!/bin/bash
file=(/opt/*)
l=${#file[*]}
for((i=0;i<$l;i++))
do
md5sum ${file[$i]} >>/data/md5.txt     ##记录密码的文件
done

方法二:
#!/bin/bash
for i in `ls /opt/*`
do
[ -f ${i} ] && md5sum ${i} >>/data/md5.txt
done

[root@localhost data]#cat md5.txt 
ba1f2511fc30423bdbb183fe33f3dd0f  /opt/1.txt
ba1f2511fc30423bdbb183fe33f3dd0f  /opt/2.txt
ba1f2511fc30423bdbb183fe33f3dd0f  /opt/3.txt
ba1f2511fc30423bdbb183fe33f3dd0f  /opt/4.txt
ba1f2511fc30423bdbb183fe33f3dd0f  /opt/5.txt

[root@localhost xh]#vim md5test.sh 
#!/bin/bash
filenew=(/opt/*) 
length=${#filenew[*]}
for((j=0;j<${length};j++))
do
    key1=$(cat /data/md5.txt | grep "${filenew[$j]}")     ##在记录密码的文件中去查看原本的密码
    key2=$(md5sum "${filenew[$j]}" )                      ##获取新文件的密码
   if [ "$key1" =  "$key2" ];then                         ##将两次的密码进行字符串的比较
      echo "${filenew[$j]} 文件没有发生改变"
    else
      echo "${filenew[$j]} 文件发生改变!"
 
    fi
done

[root@localhost xh]#echo 456 > /opt/1.txt
[root@localhost xh]#cat /opt/1.txt
456
[root@localhost xh]#echo 456 > /opt/3.txt
[root@localhost xh]#bash md5test.sh 
/opt/1.txt 文件发生改变!
/opt/2.txt 文件没有发生改变
/opt/3.txt 文件发生改变!
/opt/4.txt 文件没有发生改变
/opt/5.txt 文件没有发生改变

5、购物商场的编写

[root@localhost xunhuan2]#vim shoppingtest.sh
 
#!/bin/bash
 
a=0
i=1
sum=0
while [ $a -eq 0 ]
do
  echo "欢迎来到第 $i 家店"
  read -p "是否要进店选购?(yes/no)" DO
  while [ $DO = "yes" ]
  do
    echo "1:衣服¥500"
    echo "2:裤子¥400"
    echo "3:鞋子¥350"
    echo "4:帽子¥150"
    echo "5:袜子¥50"
    echo "6或其他:放弃选购"
 
    read -p "请选择你需要的商品序号:" num
    case $num in
    1)
      echo "选购衣服成功"
      let sum+=500
    ;;
    2)
      let sum+=400
    ;;
    3)
      echo "选购鞋子成功"
      let sum+=350
    ;;
    4)
      echo "选购帽子成功"
      let sum+=150
    ;;
    5)
      echo "选购袜子成功"
      let sum+=50
    ;;
    *)
      echo "放弃购买"
 
    esac
    read -p "是否再继续选购(yes/no)" DO
  done
 
  read -p "是否继续逛下一个店家(yes/no)" GO
  if [ $GO = "yes" ];then
    let i++
  else
    echo "您一共逛了 ${i} 家商店"
    echo "您一共消费了${sum} 元 "
    break
  fi
done

6、批量判断及创建用户

用户名存放在一个name.txt文件中,每行一个用户名,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码;若该用户不存在,提示用户输入密码,建立用户并设立其密码**

[root@localhost /test]#cat name.sh 
#!/bin/bash
 
for name in $(cat /test/name.txt )
do
   #读取用户文件,验证改USER变量中的用户是否存在,有则返回0
    #cat /etc/passwd |awk -F: '{ print $1 }'|grep "$name" &>/dev/null
    id $name &>/dev/null
    if [  $?  -eq  0  ];then
       echo "该用户已存在"
       #将经过用户筛选(已存在)的用户,将它们shadow密码信息赋予变量res
       res=$(cat /etc/shadow |grep "$name" |awk -F: '{print $2}')
       #判断用户们的密码是否存在空或则是”!!“的情况,代表密码为空
       if [ "$res" = '!!' -o  -z "$res" ]
	   then
           echo "该用户并未创建密码,开始创建密码"
           read -p "请输入 $name  的密码:" key1
           read -p "请再次输入密码,进行确认:" key2
           [ "$key1"  =   "$key2"   ]
           [ $? -eq 0   ]&&echo $key1 |passwd   --stdin  $name||echo "两次密码输入不一致!"
       else 
           echo "$name 用户已经创建密码"
       fi
 
    else
       echo "该用户不存在,正在建立中。。。"
           useradd $name &>/dev/null
           read -p "请输入 $name  的密码:" key1
           read -p "请再次输入密码,进行确认:" key2
           [ "$key1"  =  "$key2"   ]
	   [ $? -eq 0   ]&&echo $key1 |passwd   --stdin  $name||echo "两次>密码输入不一致!"
    fi
done

你可能感兴趣的:(shell脚本,linux,bash,运维)