shell 练习脚本
脚本00 变量例子
ping.sh
#!/bin/bash
#变量的使用 脚本
if [ $# -eq 0 ]; then
echo "paease add ip file"
echo "usage: `basename $0` file"
exit
fi
if [ ! -f $1 ]; then
echo "error file"
exit
fi
for ip in `cat $1`
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo "$ip is up."
else
echo "$ip is down."
fi
done
脚本01 删除用户 \\ 使用 if case 判断
#!/bin/bash
read -p "please input want delete a user " user
if [ -z $user ]; then
echo "can't empty;"
exit 1
fi
id $user >/dev/null 2>&1
if [ $? -eq 0 ]; then
:
else
echo "no such user $user"
exit 2
fi
read -p "Are you sure delete $user (Y/N)" i
case "$i" in
y|Y|yes|YES)
userdel -r $user
echo "delete $user"
;;
*)
echo "input error can't $user"
;;
esac
#if [ $i = "y" -o $i = "Y" ]; then
# userdel -r $user
# echo "delete $user"
#else
# echo "input error can't $user"
# exit 3
#fi
脚本02 简单的 jump_server
#!/bin/bash
#cat <<-EOF >>/home/teo/.bash_profile \\ 用户级别的 登录执行的文件
#/home/teo/jump_server.sh
#EOF
trap "" HUP INT OUIT TSTP \\ trap 信号捕捉 遇到这些信号 不做任何操作 不能退出
web1=192.168.10.12
web2=192.168.10.13
mysql=192.168.10.14
clear
while :
do
cat <<-EOF \\ 打印菜单
1. web1
2. web2
3. mysql
EOF
echo -en "\e[1;35mplease input number: \e[0m"
read num
case "$num" in
1)
ssh teo@$web1
;;
2)
ssh teo@$web2
;;
3)
ssh teo@$mysql
;;
"")
;;
*)
echo "error"
;;
esac
done
脚本03 一直ping脚本
#!/bin/bash
#ip=192.168.10.$i
#>a.txt # 重定向a.txt 清空a.txt
while :
do
for i in `seq 1 254`
do
{
ip=192.168.10.$i
ping -c5 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo -e "\e[1;35m$ip is ok \e[0m" | tee -a a.txt # tee -a 追加 到a.txt
else
echo -e "\e[1;31m$ip is donw \e[0m" | tee -a a.txt
fi
} & # 把上面 { } 中的代码后台执行 在子shell中执行
done
wait # 等待他前面所有的后台进程结束才执行下面的代码
sleep 10
done
脚本04 一直ping脚本
#!/usr/bin/bash
while :
do
for ip in `cat url.txt`
do
{
ping -c5 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo -e "\e[1;35m$ip is up \e[0m"
else
echo -e "\e[1;31m$ip is down \e[0m"
fi
} &
done
wait
sleep 120
done
脚本05 批量创建用户01
#!/bin/bash
while :
do
read -p "please enter name passwd num " name pass num
printf "
------------------------
you enter name is $name
you enter pass is $pass
you enter num is $num
------------------------
"
read -p "Are you sure[y/n] " action
if [ "$action" = y ]; then
echo "create user now... "
break
fi
done
for i in `seq $num`
do
id $name$i &>/dev/null
if [ $? -eq 0 ]; then
echo "$user$i already exists"
continue # 跳出本次循环
fi
useradd $name$i
echo "$pass" | passwd --stdin $name$i >>/dev/null
echo "$name$i already create"
done
脚本06 批量创建用户02
#!/bin/bash
# ./a.sh url.txt
# 批量创建用户02 读取url.txt 一行的两个字段 第一字段赋予用户名 第二字段赋予密码
# user1 123456
# user2 123456 ... ... url.txt
#IFS=$'\n' # 定义for使用回车分隔符 默认空格 两种方式
IFS='
'
for line in `cat $1`
do
name=`echo "$line" | awk '{print $1}'`
pass=`echo "$line" | awk '{print $2}'`
id $name &>/dev/null
if [ $? -eq 0 ]; then
echo "the $name is already exists."
continue
fi
useradd $name &>/dev/null
echo "$pass" | passwd --stdin "$name" &>/dev/null
if [ $? -eq 0 ]; then
echo "the $name is create."
fi
done
脚本07 ping检测网段的主机是否存在
#!/bin/bash
#使用for
for i in {1..254}
do
{
ping -c1 -w1 172.21.34.$i &>/dev/null
if [ $? -eq 0 ]; then
echo "$i is up.."
fi
} &
done
wait
echo "ping finish all"
#!/bin/bash
#使用while
i=1
while [ $i -le 254 ]
do
{
ip=172.21.34.$i
ping -c1 -w1 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo "$ip is up.."
fi
}&
let i++
done
wait
echo "ping finish all...."
#!/bin/bash
使用until
i=1
until [ $i -gt 254 ]
do
{
ip=172.21.34.$i
ping -c1 -w1 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo "$ip is up...."
fi
}&
let i++
done
wait
echo "ping finish all .... "
脚本08 1--100相加
#!/bin/bash
#使用until循环
i=1
until [ $i -gt 100 ]
do
let sum+=$i
let i++
done
echo "sum is $sum"
#!/bin/bash
#使用while循环
i=1
while [ $i -le 100 ]
do
let sum+=$i
let i++
done
echo "sum is $sum"
#/bin/bash
#使用for循环
for i in {1..100}
do
# let sum=$sum+$i
let sum+=$i
done
echo "sum is $sum"
脚本09 多线程 控制进程的数量
#!/bin/bash
# 此脚本为控制多线程的数目 太多会影响机器的性能 命名管道可以多个shell共同使用
# 利用管理文件的特性 读取一行 会少一行 内容不会覆盖 会追加 来控制 多线程的数目
thread=5 #定义多线程 数目为5
tmp_fifofile=/data/$$.fifo #定义 自定义命名管道的位置 .fifo管道文件后缀 $$当前进程的pid 仅仅用于名字 其他也可 为了不重复
mkfifo $tmp_fifofile #创建 命名管道
exec 8<> $tmp_fifofile #打开此管道 使用8描述符打开
rm -f /data/$$.fifo #可以不删除 但是会存留 删除了也不影响 已经使用描述符打开
for i in `seq $thread` #往管道描述符里面的扔5行文件 这里扔了五个回车 亦可以扔其他的
do
echo >&8 #echo 后面什么都没有会 输出一个回车符 >重定向符号 但是管道文件特殊 不会覆盖 会追加
done #&8 为调用 为8的描述符 即 往描述符8的文件 写入回车
for i in {1..254}
do
read -u 8 # -u 从描述符里面读行 这里是从8里面读 读到就继续 读不到就等着读 以此控制多线程数目
{
ip=172.21.34.$i
ping -c1 -w1 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo "$i is up.."
else
echo "$i is down.."
fi
echo >&8 # 上面读取一个会少一个 在这里 补充一个
}&
done
wait
exec 8>&- # 释放文件描述符8 循环结束后释放
echo "ping finish all... ..."
脚本10 expect 解决交互
#!/usr/bin/expect
#spawn 开启一个会话 注意解释器 /usr/bin/expect
#expect 会出现的交互
#出现yes/no 发送 yes \r回车 ;有可能不出现 跳过
#出现密码 ;结束标识
#interact交互 停在对方那边 不退出来 默认是退出
spawn ssh root@192.168.10.13
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "123456\r" };
}
interact
脚本11 expect 变量的使用及发送命令
#!/usr/bin/expect
#spawn 开启一个会话 注意解释器 /usr/bin/expect
#expect 定义变量使用sed... [lindex $argv 0] 为位置变量 0表示第1个参数
#使用 ./i.sh 192.168.10.13 root
#send 可以发送一些在远程主机执行的命令
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password 123456
set timeout 5
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$password\r" };
}
#interact
expect "#"
send "ip a\r"
send "pwd\r"
send "exit\r"
expect eof
脚本12 expect 主机 推送 公钥 密码一样的情况下
#!/bin/bash
#检测主机 如果主机存在则推送
#expect eof 结束掉expect
#set timeout 10 设置超时时间
for i in {2..253}
do
{
ip=192.168.10.$i
ping -c1 -w1 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo "$ip" >> ip.txt
/usr/bin/expect <<-EOF
set timeout 10
spawn ssh-copy-id $ip
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "123456\r" };
}
expect eof
EOF
else
echo "$ip" >> fale.txt
fi
}&
done
wait
echo "all finish... ..."
脚本13 函数的简单使用
#!/bin/bash
# 函数计算与 传递参数
# 1 只定义 调用 计算
# 2 调用时候 赋值
# 3 调用时候 传递参数
mayann(){
sum=0
for((i=1;i<=5;i++))
do
sum=$[$sum+$i]
done
echo "mayann from 1 add 5 is sum $sum.."
}
mayann
katana(){
sum=0
for ((n=1;n<=$m;n++))
do
sum=$(($sum+$n))
done
echo "katana from 1 add $m is sum $sum.."
}
m=8
katana
janice(){
sum=0
for ((i=1;i<=$1;i++))
do
let sum=$sum+$i
done
echo "janice from 1 add $1 is sum $sum.."
}
sssnow(){
echo "$(($1*$2*$3))"
}
result=`sssnow $1 $2 $3`
janice 10
janice 20
janice $1
janice $2
janice $3
echo $result
脚本13 乘法表
#!/bin/bash
i=1
for i in {1..9}
do
for ((j=1;j<=i;j++))
do
echo -n "$j*$i=$[$i*$j] "
done
echo
done
脚本14 for取所有的参数 计算
#!/bin/bash
# $@或$* 取所有的参数 赋给i
# for i 后面的也可以省略 意思是 所有的参数 赋给i
# shift 把参数 向左边 移动一位 删除一位 同 shift 1
# 1 2 运算
# 3 创建用户
for i in $@
do
let sum+=$i
done
echo "use for sum is $sum ..."
while [ $# -ne 0 ]
do
let sum+=$1
shift
done
echo "use while sum is $sum ..."
while [ $# -ne 0 ]
do
useradd $1
echo "$1 user is create"
shift
done
脚本15 打印菜单 select 用法
#!/bin/bash
#PS3为系统变量 默认select 调用此变量 如果要修改显示则可以修改
#PS1 可以 echo $PS1查看
PS3="--choice--"
while :
do
select i in disk memony cpu quit
do
case "$i" in
disk)
df -h
break
;;
memony)
free -m
break
;;
cpu)
uptime
break
;;
quit)
break 2
;;
*)
echo "input error "
break
esac
done
done