#!/bin/bash
read -p "please input a program:" program
sum=`ps -ef |grep $program |grep -v \grep |wc -l `
if [ sum = 0 ]
then echo "no process"
else
echo "have $sum process"
fi
#!/bin/bash
ping -c 2 192.168.68.2 > /etc/null
if [ "$?" -eq 0 ]
then echo host is runing
else
echo host is not runing
fi
3、if多分支结构
语法格式:
if 条件表达式
then
命令序列
elif 条件表达式
then
命令序列
elif 条件表达式
then
命令序列
else
命令序列
fi
测试1:
#比较两个数的大小
bash复制代码
#!/bin/bash
read -p "please input two number:" a b
if [ $a -eq $b ]
then
echo "$a equal $b"
elif [ $a -gt $b ]
then
echo "$a greater than $b"
else
echo "$a less than $b"
fi
测试2:
#判断字符的种类
bash复制代码
#!/bin/bash
read -p "please input a char:" char
if echo "$char"|grep "[a-zA-Z]" > /dev/null
then echo "this is a letter"
elif echo "$char"|grep "[0-9]" > /dev/null
then echo "this is a number"
else
echo "this is other"
fi
#!/bin/bash
vendor=`cat /proc/cpuinfo |awk '/vendor_id/ {print $3}' |head -1`
if [ "$vendor" = GenuineIntel ]
then echo "intel"
elif [ "$vendor" = AuthenticAMD ]
then echo "AMD"
else
echo "unknown"
fi
4、多条件判断语句case
语法格式:
case 变量名 in
值1)
指令1
;;
值2)
指令2
;;
值3)
指令3
;;
*)
默认
esac
测试1:
#判断字符串的类型
bash复制代码
#!/bin/bash
read -p "please input a char:" char
case "$char" in
[a-zA-Z])
echo "letter"
;;
[0-9])
echo "number"
;;
*)
echo "other"
esac
五、流控制之循环
1、带列表的for循环
语法格式:
for variable in list
do
statement1
statrment2
...
done
测试1:
#循环打印IP地址:
seq -f 192.168.68.1%02g 0 50 #输出100到150所有的IP地址
%02g 解析:填充两位内容其内容是0~50,位置不够用0进行填充
bash复制代码
#!/bin/bash
for IP in $(seq -f "192.168.68.1%02g" 0 50)
do
echo $IP
done
测试2:
#循环测试主机号为0~20网络是否可达,使用ping 命令
bash复制代码
#!/bin/bash
for IP in 192.168.68.{0..9} $(seq -f "192.168.68.%g" 10 20)
do
ping -c 1 $IP > /etc/null
if [ "$?" -eq 0 ]
then echo "$IP" is runing
else
echo "$IP" is not runing
fi
done
测试3:
#列出当前文件夹中所有的普通文件
ls -F #列出所有文件的类型
grep -v /$ #过滤掉斜线结尾的,即过滤掉文件夹
而这种不够严谨,除了文件和文件夹类型,还有很多的文件类型,如软连接等
bash复制代码
#!/bin/bash
for FILE in $(ls -F | grep -v /$)
do
echo $FILE
done
find ./ -type f -depth 1 #找到当前目录下文件类型为f即普通文件的所有文件,且执行深度为1,即不用找该文件夹下面所有文件夹中的文件。
bash复制代码
#!/bin/bash
for FILE in $(find ./ -maxdepth 1 -type f)
do
echo $FILE
done
测试4:
#给定一句话,找出所有字符数小于6的字符串
bash复制代码
#!/bin/bash
for str in rabbit is favorite to eat cabbage
do
if [ `expr length $str` -lt 6 ]
then echo $str
fi
done
测试5:
计算一百以内的奇数的个数
可以使用num%2==1来挑选,也可以用花括号的用法来选for num in {start..end..step},将step设置成2,那么就可以挑选出奇数,再通过for循环进行加合运算。
让一个变量去接收两个变量相加后的值一定要使用let命令
bash复制代码
#!/bin/bash
sum=0
for num in {1..100..2}
do
let "sum+=num"
#或sum=$[sum+num]
done
echo "$sum"
2、不带列表的for语句
语法格式:
for variable #等同于for variable in @或*(即执行脚本的时候要给定参数)
do
statement1
statrment2
...
done
测试1:
bash复制代码
#!/bin/bash
for i
do
echo $i
done
3、类C风格的for循环
语法格式:
for((expression1;expression2;expression3))
do
statement1;
statement2;
done
测试1:
#批量添加用户
then useradd test0"$i" 2> /dev/null #这段命令中的2>的作用就是如果报错,将报错信息丢弃
echo 123456 | passwd --stdin test"$i" #可以自定添加密码
bash复制代码
#!/bin/bash
for((i=1;i<=30;i++))
do
if [ $i -lt 10 ]
then
if id -u test0"$i" &> /dev/null
then
echo test0"$i" is exist!
else
useradd test0"$i" 2> /dev/null
echo 123456 | passwd --stdin test0"$i" > /dev/null
fi
else
if id -u test"$i" &> /dev/null
then
echo test"$i" is exist!
else
useradd test"$i" 2> /dev/null
echo 123456 | passwd --stdin test"$i" > /dev/null
fi
fi
done
测试2:
#测试192.168.68.0/24这个网段的主机有多少在线
bash复制代码
#!/bin/bash
sum=0
for IP in 192.168.68.{0..255}
do
if ping -c 1 $IP &>/dev/null
then
let sum+=1
echo "$IP is up"
else
echo "$IP id down"
fi
done
echo $sum
实验过程中问题与解决方法:
虚拟机开启 ifconfig 没有ens160网卡,无法上网,同时 图形化模式 没有有线连接选项
手动启动网卡提示:
bash复制代码
Connection 'ens160' is not available on device ens160 because device is strictly unmanaged
有一种临时方案 :
bash复制代码
dhclient ens160
执行后可以上网,可以远程连接,但是每次开机都无法自动启动,
最终找到原因是由于 NM托管未开启导致的
复制代码
查看托管状态
nmcli n
显示 disabled 则为本文遇到的问题,如果是 enabled 则可以不用往下看了
开启 托管
nmcli n on