Directorio de artículos
1. para bucle
格式:
for 变量 in item1 item2 … itemN
do
语句1
语句2
done
写成一行:
for 变量 in item;do 语句1;语句2 done;
La declaración for define cuatro formas de variables
for var in $(seq 起点 终点 步长)
for var in 1 2 3 ... 10
for var in{
1..10}
for((var=0;var<10;var++))
#无限循环
for (( ; ; ))
Ejercicio 1:
Script: check_host.sh
detecta si 10 hosts y su host actual están conectados directamente al host que está desbloqueado, si está desbloqueado, se mostrará la lista de IP del host
#!/bin/bash
for i in {
1..10}
do
ping -c1 -w1 172.25.254.$i &> /dev/null && {
echo " 172.25.254.$i tongchang !"
}
done
Ejercicio 2:
Script create.sh
- Crea usuarios automáticamente
- Agregue el archivo de nombre de usuario y el archivo de contraseña después del script
- Detecta automáticamente si el usuario en el archivo de usuario existe y lo crea automáticamente si no existe, y la contraseña es el contenido del archivo de contraseña correspondiente.
#!/bin/bash
length=`sed -n '$=' user_file`
for LINE in `seq 1 $length`
do
uName=`sed -n ${
LINE}p $1`
uPass=`sed -n ${
LINE}p $2`
id $uName &> /dev/null && {
echo "$uName is exist !"
} || {
useradd $uName
echo $uPass | passwd --stdin $uName &> /dev/null
echo "$uName is created !"
}
done
2. Bucle while (la condición es verdadera)
while 条件
do
语句1
语句2
done
Formato de bucle infinito 1:
while true
do
语句
done
Formato de bucle infinito 2:
while :
do
语句
done
3. hasta bucle (la condición es falsa)
El bucle hasta ejecuta una serie de comandos hasta que la condición es verdadera y se detiene.
El bucle hasta y el bucle while se manejan de manera opuesta.
Generalmente, el ciclo while es mejor que el ciclo hasta, pero en algunos casos, y solo en casos raros, el ciclo hasta es más útil.
until 条件
do
语句1
语句2
done
4. si
if 条件
then
语句
elif 条件
then
语句
else
语句
fi
(Si la rama else no tiene ninguna declaración para ejecutar, no escriba esto más)
Ejercicio 1:
check_file.sh
detecta si el archivo existe y determina el tipo de archivo
#!/bin/bash
while true
do
read -p "Please input filename:" fileName
if [ "$fileName" == "exit" ]
then
exit
fi
if [ -e "$fileName" ]
then
if [ -f "$fileName" ]
then
echo "$fileName is 普通文件 ! "
elif [ -d "$fileName" ]
then
echo "$fileName is 目录 ! "
elif [ -S "$fileName" ]
then
echo "$fileName is 套接字 ! "
elif [ -L "$fileName" ]
then
echo "$fileName is 软链接 ! "
elif [ -b "$fileName" ]
then
echo "$fileName is 块设备 ! "
elif [ -c "$fileName" ]
then
echo "$fileName is 字符设备 ! "
fi
else
echo "$fileName is not exist !"
fi
done
5. caso
La declaración del caso es una declaración de opción múltiple. Puede utilizar la declaración de caso para hacer coincidir un valor y un patrón. Si la coincidencia es exitosa, ejecute el comando coincidente
case 值 in
模式1)
语句
;;
模式2)
语句
;;
*)
语句
;;
esac
(" *) " indica otras circunstancias)
Ejercicio:
Agregue disco o memoria o cargue después de system_watch.sh, ejecute de la siguiente manera:
- monitor de disco uso del disco
- uso de la memoria del monitor de memoria
- cargar monitor iniciar carga
- Pantalla por segundo
#!/bin/bash
while true
do
[ "$1" = "exit" ] && {
exit
}
case $1 in
disk|DISK)
watch -n 1 "df -h "
exit
;;
memory|MEMORY)
watch -n 1 "free -m"
exit
;;
upload|UPLOAD)
watch -n 1 "uptime"
exit
;;
esac
done
6. Espere una conversación automática
dnf install expect -y
: Instalar esperar
Script de preguntas: ask.sh (otorgar permiso de ejecución)
#!/bin/bash
read -p "What's your name: " NAME
read -p "How old are you: " AGE
read -p "which class? " CLASS
read -p "How do you feel? " FEEL
echo $NAME is $AGE\'s old study $CLASS fell $FEEL
Script de respuesta 1: answer.exp
#!/usr/bin/expect
spawn /mnt/ask.sh
expect "name"
send "tom\r"
expect "old"
send "18\r"
expect "class"
send "linux\r"
expect "feel"
send "happy\r"
expect eof
Script de respuesta 2: answer.exp
#!/usr/bin/expect
set timeout 2
spawn /mnt/ask.sh
expect {
"name" {
send "tom\r"; exp_continue }
"old" {
send "18\r"; exp_continue }
"class" {
send "linux\r" ; exp_continue }
"feel" {
send "happy\r" }
}
expect eof
Script de respuesta 3: answer.exp
#!/usr/bin/expect
set NAME [ lindex $argv 0 ]
set AGE [ lindex $argv 1 ]
set CLASS [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
set timeout 2
spawn /mnt/ask.sh
expect {
"name" {
send "$NAME\r" ; exp_continue }
"old" {
send "$AGE\r" ; exp_continue }
"class" {
send "$CLASS\r" ; exp_continue }
"feel" {
send "$FEEL\r" }
}
expect eof
Script de respuesta 4: answer.sh
#!/bin/bash
echo hello zy !
/usr/bin/expect <<EOF
set timeout 2
spawn /mnt/ask.sh
expect {
"name" { send "$1\r" ; exp_continue }
"old" { send "$2\r" ; exp_continue }
"class" { send "$3\r" ; exp_continue }
"feel" { send "$4\r" }
}
expect eof
EOF
Ejercicio:
host_list.sh
detecta si la red 172.25.254.1-172.25.254.10 está normalmente encendida, si la red es normal, genere una lista de resolución host_list
#!/bin/bash
EXPECT()
{
/usr/bin/expect <<EOF
set timeout 2
spawn ssh root@$1 hostname
expect {
"yes/no?" { send "yes\r" ;
expect "password:" ;
send "$2\r";
exp_continue; }
"password:" { send "$2\r" }
}
expect eof
EOF
}
for i in {
1..10}
do
ping -c1 -w1 172.25.254.$i &> /dev/null
if [ "$?" = "0" ]
then
host_name=`EXPECT 172.25.254.$i westos | tail -n 1`
grep $host_name /mnt/host_list &> /dev/null || {
echo "172.25.254.$i $host_name" >> /mnt/host_list
}
fi
done
sed 's/^M//g' -i /mnt/host_list
#^M为<ctrl>+<V>+<M>
7. Salir del bucle (romper y continuar y salir)
romper: Permitir saltar de todos los bucles (terminar todos los bucles después de la ejecución)
Seguir: No saltará de todos los bucles, solo del bucle actual
salida:abandonar