#!/bin/bash
#****************
#Author: Pakho
#Date: 2021-00-00
#FileName: .sh
#****************
一、安装
[root@pakho ~]# yum -y install tcl expect tclx tcl-devel
二、Expect工作原理
实例
#!/bin/bash
#****************
#Author:Pakho
#Date:2021.5.12
#Filename:ssh.sh
#****************
>ip.txt
for i in {2..245}
do
{
ip=192.168.100.$i
ping -c1 -W1 $ip &>/dev/null
if [ $? -eq 0 ]
then
echo "$ip" >>ip.txt
/usr/bin/expect <<-EOF
spawn ssh-copy-id $ip
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "11111111\r" }
}
expect eof
EOF
fi
}
done
wait
echo "完成!"
#!/bin/bash
declare -A shells #声明数组
while read ll #通过交互定义变量读取文件的内容定义给ll变量
do
type=`echo $ll | awk -F: '{print $7}'` #输出文件内容 -F:指定冒号分隔符
let shells[$type]++ #let变量运算 shells数组名称 $type 索引
done < /etc/passwd #使用文件里面的内容
for i in {!shelle[*]} #!取反 使用索引进行循环 #使用循环遍历数组
do
echo "shell类型/索引 $i ; shell数量 ${shells[$i]}" #数组名称加索引看值
done
#!/bin/bash
while read line
do
#hosts:数组名
#[++i]:索引递增,++i是1开始,i++是0开始
#$line:值,即文件中的内容
hosts[++i]=$line
done < /etc/hosts
#输出索引每一行
for i in ${!hosts[*]}
do
echo "hosts数组的索引是 $i,值是 ${hosts[$i]}"
done
#!/bin/bash
OLD_IFS=$IFS #将旧的分隔符备份
IFS=$'\n' #定义for循环的分隔符为换行符
for i in `cat /etc/hosts`
do
hosts[++x]=$i
done
for bb in ${!hosts[*]}
do
echo "hosts数组的索引是 $bb ,值是 ${hosts[$bb]}"
done
IFS=$OLD_IFS #将分隔符还原便于脚本后方的for使用
for循环使用空格和回车作为分隔符
while循环使用回车作为分隔符
系统默认的分隔符变量为IFS 例:IFS=$'\n' 将换行符定义为换行 \r:回车
function name() {
statements
[return value]
}
对各个部分的说明:
由{ }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。
一、定义函数
方法一:
函数名(){
函数要实现的功能代码
}
方法二:
function 函数名 {
函数要实现的功能代码
}
二、调用函数
函数名
函数名 参数1 参数2
函数存在的意义在于反复调用 以上只是举例
示例:
需求:通过shell脚本,编写工具箱,引用函数并调用函数
思路:
#!bin/bash
#打印出工具箱菜单
yesorno () { read -p "继续按y,退出程序按n:" yn #定义函数yesorno
if [ "$yn" = y ]
then
clear #清屏 类似于Crtl+l键
else
exit
fi
}
menu () { #定义函数menu
cat <-------系统工具箱-------
| 1.查看磁盘信息 |
| 2.查看内存信息 |
| 3.查看CPU信息 |
| 4.查看网络信息 |
| 5.查看进程信息 |
| 6.退出工具箱 |
-------系统工具箱-------
EOF
}
while : #使用whlie循环
do
menu #调用函数menu
read -p "请输入你的选择[1..6]" number #使用交互定义变量
case $number in #使用case流控
1)
echo "===========磁盘信息=========="
df -hT
echo "===========磁盘信息=========="
read -p "继续按y,退出程序按n:" yn
yesorno #调用函数yesorno
;;
2)
echo "===========内存信息=========="
free -m
echo "===========内存信息=========="
yesorno #调用函数yesorno
;;
3)
echo "============CPU信息==========="
uptime
echo "============CPU信息==========="
yesorno #调用函数yesorno
;;
4)
echo "=========网络端口信息========"
read -p "请输入您要查询的网络端口号" hao
netstat -anpt | head -2
netstat -anpt | grep $hao
echo "=========网络端口信息========"
yesorno #调用函数yesorno
;;
5)
echo "===========进程信息=========="
read -p "请输入您要查询的进程名" ps
ps aux | grep $ps
echo "===========进程信息=========="
yesorno #调用函数yesorno
;;
6)
echo "感谢使用系统工具箱"
exit
;;
*)
menu #调用函数menu
;;
esac
done #Script结束
三、函数传参
#!/bin/bash
fun () { #定义函数名fun
fff=1 #定义阶乘元数
for ((i=1;i<=$1;i++)) #使阶乘循环
do
fff=$[$fff * $i] #阶乘公式
done
echo "$fff" #输出阶乘结果
}
fun $1
fun $2
fun $3
测试:
[root@pakho ~]# bash fun1.sh 5 6 7
120 #5的阶乘是120
720 #6的阶乘是720
5040 #7的阶乘是5040
#!bin/bash
fun () {
fff=1
for i in `seq $1`
do
let fff*=$i #fff等于 fff*$i=fff
done
echo "$fff"
}
fun $1
fun $2
fun $3
需求:制作一个简单的阶乘脚本,通过数组给函数传参
#!/bin/bash
num=(1 2 3) #定义数组
array () { #定义函数
factorial=1
for i in $*
do
factorial=$[factorial * $i] #定义阶乘的公式
done
echo $factorial
}
array ${num[*]} #位置变量中的所有变量
例4:函数结果,赋予数组
场景:用户获赠流量包(每人增加5G),结果运算
#!/bin/bash
num=(1 2 3) #定义数组表示用户的初值
array () {
local g #local 定义变量仅在函数中有效
for i in $*
do
outarray[g++]=$[$i+5] #第二个数组表示计算之后的值
done
echo ${outarray[*]} #输出新的数组
}
array ${num[*]}
:
true #真
false #假
exit #退出程序
break #退出循环
continuesh #跳出本次循环进行下一次循环
shift #
———————————————————————————————————————————————————————————————————————————————————
shift使位置参数向左移动,默认移动一位,可以使用shift 2
exit 退出整个程序
break结束当前循环,或跳出本层循环
continue 忽略本次循环的代码,直接进行下一次的循环
实例
需求:跳出5的循环
环境:
[root@pakho ~]# bash for.sh
A123456789
B123456789
C123456789
D123456789
#!/bin/bash
for i in {A..D}
do
echo -n $i
for j in {1..9}
do
if [ $j -eq 5 ]
then
# continue
# break 2 break可以添加参数 跟的数字决定跳出几个循环体
# exit
fi
echo -n $j
done
echo #echo相当于回车
done
例2:shift参数移动
1)for循环不定义循环范围,循环取参数作为循环范围
#!/bin/bash
for i
do
let sum+=$i #+= sum+$i等于sum 将结构赋值给sum
done
echo "总和:$sum"
2)使用while循环,发现停不下来
#!/bin/bash
while [ $# -ne 0 ]
do
let sum+=$1
done
echo "总和:$sum" #成为死循环 发现循环无法停止
3)使用shift移动参数的命令,结果得以实现
#!/bin/bash
while [ $# -ne 0 ]
do
let sum+=$1
shift #本行添加
done
echo "总和:$sum"
#!/bin/bash
while [ $# -ne 0 ]
do
useradd $1
echo "$1 创建成功"
shift
done