- read
每次调用读取文件中的“一行”,当文件没有可读时,read命令将以非零状态退出。
读取文件的关键是如何将文本的数据传送给read命令。
最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令。
#!/bin/bash
count=1
cat text.sh| while read line --------cat命令的输出作为read命令的输入,read读到的值放在line中
do
echo "Line $count:$line"
count=$[ $count+1 ]
done
echo "finish"
exit 0
echo 显示信息
echo 回车后会空一行
echo -n
[root@localhost ~]# echo
[root@localhost ~]# echo -n--------- -n 不输出行尾的换行符,不会出现空行
[root@localhost ~]#
#!/bin/bash
for i in 1 2 a b c ----- 【i在这里是个变量】【变量的值可以被覆盖】
do
echo $i ---------- 【读取结果】
done
for i in a tt yy uu 22 33 -----------【这里的i只是表示反复读取的次数】
do
echo abc
done
[root@localhost ~]# echo {1..20} 【产生8个数字】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[root@room9pc01 ~]# echo [a,b,c]-------------注意不要用成方括号
[a,b,c]
[root@localhost ~]#
[root@localhost ~]# seq 5 -----------生成1---5
1
2
3
4
5
[root@localhost ~]# seq 2 5----生成2---5
2
3
4
5
[root@localhost ~]# seq 2 5 20------生成以2开始递增值为5,直到20的所有值
2
7
12
17
[root@localhost ~]#
#!/bin/bash
for i in {1..1000} --------【注意:{}没有空格】
do
touch /tmp/$i.txt & ----------【&速度会提高】
done
#!/bin/bash
for i in `seq 1000`
do
rm -rf /tmp/$i.txt &
done
写脚本,将/var/log/目录下,每个文件或目录,单独打包
ls /var/log
/var/log/a---->/var/log/a.tar.gz
/var/log/b---->/var/log/b.tar.gz
/var/log/c---->/var/log/c.tar.gz
tar -czf 打包后的文件名 打包对象
-c (create)
-z (gzip)
-f (file)
./test11.sh
#!/bin/bash
for i in `ls /var/log/` 【ls取出的东西是没有路径的】
do
tar -czf /var/log/$i.tar.gz /var/log/$i &> /dev/null 【压缩是要给路径的!!从哪来,到哪去!】 重点:&> /dev/null
done
+++++一定要给绝对路径,否则会读取当前路径++++++
for 变量 in 值1 值2 值3 ...
do
命令
done
for ((i=1;i<=5;i++))
do
echo abc
done
练习:(打印9*9乘法表) 需要两个for
vim 1.sh
#!/bin/bash
for i in `seq 9`
do
for j in `seq $i`
do
echo -n "$j*$i=$[j*i]" && echo -n " " && [ $j -eq $i ] && echo----------------echo -n可以做到不换行,echo则会换行
done
done
[root@room8pc205 ~]# ./1.sh |column -t-------column -t自动对齐
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
或者
[root@room9pc01 ~]# for i in `seq 9`; do for j in `seq $i`; do echo -n "$i*$j=$[i*j]" && echo -n " " ; done; echo; done | column -t
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
echo -e "\033[31mOK\033[Om"
echo -e【扩展】 "\033【 颜色】[31【shai】mOK【内容】\033【颜色】[Om【色到哪里】"
extend 所有内容是红色\这个之间是红色
while 测试
do
命令
done
当测试为真时,执行命令,直到测试为错时,循环结束
i=1
while [ $i -le 5 ]
do
echo abc
let i++ //循环5次
done
#!/bin/bash ---------------死循环
i=1
while [ $i -le 5 ]
do
echo $i
done
定义死循环
while : ----------------【不固定次数】
do
done
或
while true
do
done
ping网段
- for i in {1..254}
- do
- ping -c 2 192.168.4.$i &> /dev/null
- if [ $? -eq 0 ];
- then
- echo "192.168.4.$i is up"
- let x++
- else
- echo "192.168.4.$i is down"
- fi
- done
- echo $x
+++++++++++++++++++++++++++++++++++++++++++++++++
国际象棋棋盘
- #!/bin/bash
- for i in {1..8}
- do
- for j in {1..8}
- do
- if [ $[(i+j)%2] -eq 0 ] ; then
- echo -en "\033[41m \033[0m"
- else
- echo -en "\033[47m \033[0m"
- fi
- done
- echo
- done
###批量创建用户###
- 版本1
- for i in {1..100}
- do
- useradd user$1
- done
版本2
- useradd $1
- echo "$2" | passwd --stdin $1
- for i in `cat user.txt`
- do
- useradd $i
- echo "123456" | passwd --stdin $i
- done
- #!/bin/bash
- for i in {1..254}
- do
- ping -c 3 172.40.3.$i $>/dev/null
- if [ $? -eq 0 ];
- then
- ssh 172.40.3.$i shutdown //需要免密
- else
- echo "172.40.3.$i is down"
- fi
- done
当用户输入redhat,返回fedora
当用户输入fedora,返回redhat
其他,返回Usage:xxx
在 system1 上创建一个名为/root/foo.sh 的脚本,让其提供下列特性:
当运行/root/foo.sh redhat,输出为 fedora
当运行/root/foo.sh fedora,输出为 redhat
当没有任何参数或者参数不是 redhat 或者 fedora 时,其错误输出产生以下的信息:
/root/foo.sh redhat|fedora
[root@serverX ~]# vim /root/foo.sh
- #!/bin/bash
- if [ $# -eq 0 ]
- then
- echo "/root/foo.sh redhat|fedora" >&2
- elif [ "$1" = "redhat" ]
- then
- echo "fedora"
- elif [ "$1" = "fedora" ]
- then
- echo "redhat"
- else
- echo "/root/foo.sh redhat|fedora" >&2
- fi
[root@serverX ~]# chmod +x /root/foo.sh
或者
[root@serverX ~]# vim /root/foo.sh
- #!/bin/bash
- case "$1" in
- redhat)
- echo "fedora";;
- fedora)
- echo "redhat";;
- *)
- echo '/root/foo.sh redhat|fedora' >&2;;
- esac
- [root@serverX ~]# chmod +x /root/foo.sh
- case 简化版的if(功能比if少)
语法格式
case 变量 in -------判断变量与值1是否相等
值1)
命令
命令;;
值2)-----------判断变量与值2是否相等
命令;;
*) -----------------相当于if语句中的else
命令;;
esac
#!/bin/bash
- case $1 in
- redhat)
- echo "fedora";;
- fedora)
- echo "redhat";;
- *)
- echo "usage:xxx";;
- esac
- read -p "请输入点嘛:" key
- case $key in
- [a-Z])------------Z a-Z 的大小写都可以识别【逻辑上的或者】 还可以写成[a-z]|[A-Z])
- echo "字母";;
- [0-9])
- echo "数字";;
- *)
- echo "符号";;
- esac
+++++++++++++++++++++++++++++++++++++++++++++++
快速将vim中的所有都注释掉:ECS,Ctrl+v,下键,I,#,ESC
u 在vim编辑器里,可以撤销上一条命令
[0-9][0-9] 表示两位数
函数(避免代码的重复)
yum install httpd
systemctl start httpd
systemctl enable httpd
语法:
1.定义函数
函数名(){
命令
命令
命令
}
2.调用函数:
函数名
[root@localhost ~]# mymkdir () {
> mkdir $1
> cd $1
> ls -lh $1
> }
[root@localhost ~]# mymkdir /a
总用量 0
[root@localhost a]# mymkdir /b
总用量 0
[root@localhost b]# mymkdir /hehe
总用量 0
[root@localhost hehe]#
##写到profile里才是永久的。
install () {
yum -y install $1
systemctl start $1
systemctl enable $1
}
调用函数:
install httpd
install vsftpd
install mariadb-server
#!/bin/bash
cecho () {
echo -e "\033[$1m$2 \033[0m"
}
cecho 32 OK
cecho 32 OK
cecho 32 OK
+++++++++++++++++++++++++++++++++++++++++++
函数名称(){
命令
命令
命令
}
vim test.sh //死机.死得很彻底
#!/bin/bash
.(){ //定义函数名称为.
.|.& //调用自己管道给自己,后台运行【核心问题在&上】
}
. //自己执行
---------------------------------------------------------------------------
vim test.sh
num=`who |wc -l`
[ $num -gt 3 ] && mail xxx
crontab -e
* * * * * /root/test.sh
vim test.sh
while:
do
echo a
echo b
done
结果:while死循环,不会结束。每分钟都会执行
可以:
vim a.sh
while:
do
text.sh
done
-------------------------------------------------------------------------------------
脚本的中断
假设i=x
for i in {1..254}
do
ssh 192.168.4.$i shutdown++
done
结果:##自己是谁## 同一个网段的才可以ssh,如果自己是10,就把自己关掉了
脚本的目的是什么
continue:结束本次循环,进入下一次循环。不关心是for还是while。
break:结束整个循环体
exit:结束脚本
eg:
for i in {1..5}
do
echo $i
continue //1结束直接跳到2循环....
echo a
done
for i in {1..5}
do
echo $i
break //整个循环结束...
done
echo over
1 over
for i in {1..5}
do
[ $i -eq 3 ] && [continiu|break|exit]
只有3不执行|只有1.2|1,2,然后直接退出脚本
echo $i
done
echo over
[root@localhost test]# vim duan.sh
[root@localhost test]# . duan.sh //continue
1
2
4
5
echo over
[root@localhost test]# vim duan.sh
[root@localhost test]# . duan.sh //break
1
2
echo over
[root@localhost test]# vim duan.sh
[root@localhost test]# . duan.sh //exit
1
2
- vim qiuhe.sh
- #!/bin/bash
- sum=0
- while :
- do
- read -p "请输入整数:" num
- [ $num -eq 0 ] && break
- sum=$[sum+num]
- done
- echo $sum
-----------------------------------------------------------------------------------------------------------------
跳过1~20以内非6的倍数,输出其他数的平方值,设定退出代码为2
for i in {1..20}
do
x=$[i%6]
[ $x -ne 0 ] && continue
echo $[i*i]
done
---------------------------------------------------------------------------------------------------------------------------
1-10输出3,6,9 的平方数(3的倍数)
在红帽6中可以安装bash-completion====》》》》Tab+++++++++++++++++++++++++++++++++++++++++++++++++++
[root@svr5 ~]# vim /etc/init.d/myhttpd
- #!/bin/bash
- # chkconfig: 2345 90 10
*) //默认输出脚本用法
echo "用法: $0 {start|stop|status|restart}"
exit 1
esac
[root@svr5 ~]# chmod +x /etc/init.d/myhttpd - # description: Startup script for http Server. (for Test only)
- #!/bin/bash
- case $1 in
- start)
- /usr/sbin/httpd
- echo "我已经启动了";;
- stop)
- kill `cat /var/run/httpd/httpd.pid`;; #反引号
- restart)
- kill `cat /var/run/httpd/httpd.pid`
- sleep 1
- /usr/sbin/httpd;;
- status)
- if [ -f /var/run/httpd/httpd.pid ];then
- echo "服务正在运行..."
- else
- echo "服务已经关闭"
- fi;;
- esac
- [root@svr5 ~]# vim funexpr.sh
- #!/bin/bash
- myexpr() {
- echo "$1 + $2 = $[$1+$2]"
- echo "$1 - $2 = $[$1-$2]"
- echo "$1 * $2 = $[$1*$2]"
- echo "$1 / $2 = $[$1/$2]"
- }
- myexpr $1 $2
- [root@svr5 ~]# chmod +x funexpr.sh
- 3)测试脚本执行效果
- [root@svr5 ~]# ./funexpr.sh 43 21
- 43 + 21 = 64
- 43 - 21 = 22
- 43 * 21 = 903
- 43 / 21 = 2
- [root@svr5 ~]# ./funexpr.sh 1234 567
- 1234 + 567 = 1801
- 1234 - 567 = 667
- 1234 * 567 = 699678
- 1234 / 567 = 2
- [root@svr5 ~]# vim sum.sh
- #!/bin/bash
- while read -p "请输入待累加的整数(0表示结束):" x
- do
- [ $x -eq 0 ] && break
- SUM=$[SUM+x]
- done
- echo "总和是:$SUM"
- 1)编写脚本文件
- [root@svr5 ~]# vim mysum.sh
- #!/bin/bash
- i=0
- while [ $i -le 20 ]
- do
- let i++
- [ $[i%6] -ne 0 ] && continue
- echo $[i*i]
- done
- exit 2