for循环的基础使用
for循环:
for 变量名 in 列表;do
循环体
done
执行机制:
依次将列表中的元素赋值给“变量名”;每次赋值后即执行一次循环体;直到列表中的元素耗尽循环结束
添加10个用户,user1 user2 user3 user4 ...密码同用户名
#!/bin/bash
if [ ! $UID -eq 0 ];then
echo "only root"
exit1
fi
for i in {1..10};do
if id user$i &> /dev/null;
else
useradd user$i
if [ $? -eq 0 ];then
echo "user$i"|passwd --stdin user$i &> /dev/null
echo "Add user$i finished."
fi
fi
done
这里需要使用到seq命令:
例:打印1-10的奇数
[root@station40 ~]# seq 1 2 10
1
3
5
7
9
例:打印1-10
[root@station40 ~]# seq 1 10
1
2
3
4
5
6
7
8
9
10
列表生成方法
(1)直接给出列表
(2)整数列表
(a){start..end}
(b)$(seq [start [step]] end)
(3)返回列表的命令;
$(COMMAND)
例:判断var目录下哪些是文件哪些是目录哪些是链接文件
#!/bin/bash
#
for file in $(ls /var); do
if [ -f /var/$file ]; then 给出绝对路径
echo "command file"
elif [ -L /var/$file ];then
echo "symbolic file"
echo [ -d /var/$file ];then
echo "directory"
else
echo "other type"
fi
done
现在我们打开netstat -tan 查看端口的有哪些状态
[root@station40 ~]# netstat -tan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 52 172.16.251.40:22 172.16.252.158:2297 ESTABLISHED
tcp 0 0 :::22 :::* LISTEN
tcp 0 0 ::1:25 :::* LISTEN
现在需要统计这几种状态各有出现的次数
例:
#!/bin/bash
#
declare -i estab=0
declare -i estab=0
declare -i estab=0
for state in $( netstat -tan | grep "^tcp\>" | awk '{print $NF}');do
if [ "$state" == 'ESTABLISHED' ]; then
let estab++
elif [ "$state" == 'LISTEN' ];then
let listen++
else
let other++
fi
done
echo "ESTABLISHED:$estab"
echo "LISTEN:$listen"
echo "Unkown:$other"
for ..do ..done 数值处理
for ((初始值;限制值;执行步长))
初始值:某个变量在循环当中的初始值,直接以类似i=1设置好;
限制值:当变量的值在这和限制的范围内,就连续进行循环,例如i<=1;
执行步长:每做一次循环时变量的变化量。例如i=i+1
计算1+2+3+4...+n的值
[root@localhost ~]# vim nn
#!/bin/bash
read -p "please input anumber: " nu
s=0
for (( i=1; i<=$nu; i=i+1 ))
do
s=$(($s+$i))
done
echo $s
在编辑脚本的过程中最怕的就是出现语法错误,同时bash中的相关参数是可以在脚本编辑完成后可以不执行脚本的情况下进行测试;
[root@localhost ~]# sh [-nvx] scripts.sh
参数:
-n : 不要执行scripts,仅查询语法问题
-v : 在执行scripts前,先将scripts的内容输出到屏幕上;
-x : 将使用到的scripts内容显示到屏幕上
例:ping192.168.1.1~192.168.100.100的网络状态
[root@localhost Script]# cat for1.sh
#!bin/bash
network="172.16"
for sitenu in $(seq 1 100)
do
ping -c 1 -w ${network}.${sitenu}.${sitenu} &> /dev/null && result=0 || result=1
if [ "$result" == 0 ];then
echo "server ${network}.${sitenu}.${sitenu} is up"
else
echo "server ${network}.${sitenu}.${sitenu} is down"
fi
done
例:
1.请新建一个script,当执行script的时候,该script可以显示你目前的身份(shoami)和你目前所在的目录(用pwd)
#!bin/bash
k=$(pwd)
w=$(whoami)
echo "the system root is:$k"
echo "the system directories is $w"
例:让用户输入一个数字,程序可以由1+2+3+...一直累加到用户输入的数值为止
[root@localhost Script]# cat for3.sh
#!bin/bash
s=0
i=0
read -p "please input numble: " n
while [ "$i" != "$n" ]
do
i=$((i+1))
s=$(($s+$i))
done
echo "$s"
#!bin/bash
s=0
read -p "please input a numble: " n
for (( i=1; i<=$n; i=i+1 ))
do
s=$(($i+$s))
done
echo $s
例.编写一个脚本,它的作用是先查看一下/root/test/logical 这个名称是否存在,若不存在,则创建一个文件,
使用touch来创建,创建完成后离开;如果存在的话,判断该名称是否为文件,若为文件则将之删除后新建一个
目录,文件名为logical,之后离开;如果存在的话,而且该名称目录,则删除此目录!
#bin/bash
file="/root/test/ll"
file1="/root/test"
rm="rm -rf /root/test/ll"
if [ ! -d "$file1" ];then
mkdir $file1
fi
if [ ! -f "$file" ];then
touch $file
else
$rm
fi