Artigo Diretório
1. for loop
格式:
for 变量 in item1 item2 … itemN
do
语句1
语句2
done
写成一行:
for 变量 in item;do 语句1;语句2 done;
A instrução for define quatro formas de variáveis
for var in $(seq 起点 终点 步长)
for var in 1 2 3 ... 10
for var in{
1..10}
for((var=0;var<10;var++))
#无限循环
for (( ; ; ))
Exercício 1:
Script: check_host.sh
detecta se 10 hosts e seu host atual estão diretamente conectados ao host que está desbloqueado, se desbloqueado, a lista de ip do host será exibida.
#!/bin/bash
for i in {
1..10}
do
ping -c1 -w1 172.25.254.$i &> /dev/null && {
echo " 172.25.254.$i tongchang !"
}
done
Exercício 2:
Script create.sh
- Criar usuários automaticamente
- Adicionar arquivo de nome de usuário e arquivo de senha após o script
- Detectar automaticamente se o usuário existe no arquivo do usuário e criá-lo automaticamente se ele não existir, e a senha é o conteúdo do arquivo de senha correspondente
#!/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. Loop while (condição é verdadeira)
while 条件
do
语句1
语句2
done
Formato de loop infinito 1:
while true
do
语句
done
Formato de loop infinito 2:
while :
do
语句
done
3. loop até (condição é falsa)
O loop until executa uma série de comandos até que a condição seja verdadeira e pare.
O loop until e o loop while são tratados da maneira oposta.
Geralmente o loop while é melhor do que o loop until, mas em alguns casos - e apenas em casos raros, o loop until é mais útil
until 条件
do
语句1
语句2
done
4. se
if 条件
then
语句
elif 条件
then
语句
else
语句
fi
(Se o outro ramo não tiver nenhuma instrução para executar, não escreva este outro)
Exercício 1:
check_file.sh
detecta se o arquivo existe e determina o tipo de arquivo
#!/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
A declaração case é uma declaração de múltipla escolha. Você pode usar a instrução case para combinar um valor e um padrão. Se a correspondência for bem-sucedida, execute o comando correspondente
case 值 in
模式1)
语句
;;
模式2)
语句
;;
*)
语句
;;
esac
(" *) " indica outras circunstâncias)
Exercício:
Adicione disco ou memória ou faça upload após system_watch.sh, execute da seguinte forma:
- monitor de disco uso de disco
- monitor de memória uso de memória
- carregar monitor iniciar carregamento
- Exibir 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 uma conversa automática
dnf install expect -y
: Instalação esperada
Script de pergunta: ask.sh (dar permissão de execução)
#!/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 resposta 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 resposta 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 resposta 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 resposta 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
Exercício:
host_list.sh
detecta se a rede 172.25.254.1-172.25.254.10 está normalmente ligada, se a rede estiver normal, gere uma lista de resolução 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. Saia do circuito (interrompa e continue e saia)
pausa: Permite pular de todos os loops (encerrar todos os loops após a execução)
continuar: Ele não vai pular de todos os loops, apenas do loop atual
Saída:cair fora