Instruções e funções de loop de programação shell
Uma declaração de eco
1.1 Caracteres de escape comumente usados de eco
Echo -n significa saída sem
quebras de linha . Echo -e exibe caracteres de escape e exibe o conteúdo de escape na tela
Caracteres de escape comuns | Paráfrase |
---|---|
\ b | Depois de escapar, é equivalente a pressionar a tecla backspace (backspace), mas a premissa é que existem caracteres após "\ b"; "\ b" significa excluir o caractere anterior e "\ b \ b" significa excluir os dois primeiros caracteres. |
\ c | Saída sem quebra de linha. Quando não há caracteres após "\ c", o efeito é equivalente a echo -n; Mas quando ainda há caracteres após "\ c", os caracteres após "\ c" não serão exibidos. |
\ n | Avanço de linha, os caracteres a serem produzidos começam em uma nova linha de "\ n". |
\ v ou \ f | Quebra de linha, mas o início da nova linha após a quebra de linha está conectado ao final da linha anterior |
\ t | Significa inserir a guia, ou seja, a guia horizontal; |
\ r | O cursor se move para o início da linha, mas não quebra, o que equivale a usar os caracteres após "\ r" para substituir os caracteres do mesmo comprimento antes de "\ r", mas quando não houver nenhum caractere depois de "\ r", aquele antes de "\ r" Os caracteres não serão substituídos |
\\ | Significa inserir "\" a si mesmo |
Exemplo de operação
1.2 Método de cálculo
Existem 4 métodos de cálculo no script de shell
1. i=$(expr 12 \* 5)
2. i=$((12*5))
3. i=$[12*5]
4. let i= 12*5
i++相当于i=$[$i+1]
i--相当于i=$[$i-1]
i+=2相当于i=$[$i+2]
Declaração de dois laços
2.1 para loop
Ao usar uma instrução de loop for, você precisa especificar uma variável e uma lista de valores possíveis e executar a mesma sequência de comandos repetidamente para cada valor diferente até que o valor da variável se esgote e saia completamente do loop. Aqui, a lista de valores é a condição de execução da instrução for, que inclui vários objetos com os mesmos atributos, que precisam ser especificados com antecedência.
2.1.1 para formato de loop
for 变量名 in 取值列表
do
命令序列
done
Exemplo: Adicionar usuário e excluir usuário
#!/bin/bash添加用户
ULIST=$(cat /root/user.txt)
for UNAME in $ULIST
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME &> /dev/null //把输出信息丢弃
done
#!/bin/bash删除用户
$ULIST=$(cat /root/user.txt)
for UNAME in $ULIST
do
userdel -r $UNAME
[$? -eq 0] && [echo "已删除用户$UNAME"]
done
2.1.2 Interrupção de loop (interromper, continuar)
Por padrão, break salta de um único loop, break 2 salta de dois loops e assim por diante, break n salta de n loops.
continue termina um comando em um loop, mas não termina completamente o loop inteiro
2.1.3 Três métodos de loop for
方法1
[root@localhost ~]#for i in {1..10};do echo $i;done //按序输出1到10
[root@localhost ~]#for i in {1..10..2};do echo $i;done //输出1到10,步长为2
方法2
[root@localhost ~]#for i in $(seq 1 10);do echo $i;done //按序输出1到10
[root@localhost ~]#for i in $(seq 1 2 10);do echo $i;done //输出1到10,步长为2
方法3
[root@localhost ~]#for ((i=1;i<=10;i++));do echo $i;done
2.2 while loop
while 条件测试操作
do
命令序列
done
Exemplo: adivinhe o preço da mercadoria
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "good's price between 0-999,how much?"
while true
do
read -p "please input the price you guessed:" INT
let TIMES++
if [ $INT -eq $PRICE ];then
echo "You're right.The price is $PRICE"
echo "You have guessed $TIMES times."
exit 0
elif [ $INT -gt $PRICE ];then
echo "Too high!"
else echo "Too low!"
fi
done
2.3 até o loop
Teste uma determinada condição repetidamente e execute-a repetidamente, desde que a condição não seja estabelecida
until 条件测试操作
do
命令序列
done
Exemplo: acumular de 1
#!/bin/bash
read -p "从1加到几?" num
i=0;s=0
until [ $i -eq $num ]
do
let "i++";let "s=$s+$i"
done
echo "sum(1...$num)="$s
Três funções
Definição de função
[function] 函数名 ()
{
命令序列
[return x]
}
Funções de chamada
函数名 [参数1] [参数2]
3.1 Valor de retorno da função
Retornar significa sair da função e retornar um valor de saída. O script pode usar ? Variáveis para exibir o valor. Princípios de uso: 1 Obter o valor de retorno assim que a função terminar, porque? As variáveis exibem o valor. Princípios: 1 Obter o valor de retorno quando a função terminar ,Porque? A quantidade de variável mostrada de forma significativa, o valor faz uso do original é : um número de função de uma viga de junção para tomar retorna ao valor , porque como ? A variável retorna apenas o último comando executado status
de saída 2 o código de status de saída deve ser 0-255, além Ao dividir por 256, pegue o restante
db()
{
read -p "input:" value
return $[$value * 2]
}
db
echo $?
3.2 Função recursiva
A função recursiva chama a si mesma. Ao analisar a função, você pode pular a chamada de função e então analisar a parte.
Exemplo: percorrer diretórios e arquivos executáveis recursivamente em variáveis de ambiente
#!/bin/bash
//递归函数部分
file_list() {
for f in $1/* // $1/*表示取值列表,读取PATH下目录
do
if [ -d $f ];then //对$f进行判断,-d表示是否为目录
echo "$2$f"
file_list "$f" " $2" //调用函数自身,把$f下的所有目录和文件作为取值列表,再次进行判断
elif [ -x $f ];then //对$f进行判断,-x表示是否为可执行文件
echo "$2$f" //输出空格接该文件
fi
done
}
//主程序部分
IFS=$IFS':' //IFS字段分隔符,默认包含空格,换行,制表符,加入':'对冒号也可以识别并进行分隔
for folder in $PATH
do
echo "$folder:"
file_list "$folder" " " //调用函数,加入位参1,2
done
3.3 Criação e chamada de biblioteca de funções
Exemplo: biblioteca de funções de adição, subtração, multiplicação e divisão
创建函数库
[root@localhost ~]#vim myfuncs.sh
jiafa()
{
echo $[$1+$2]
}
jianfa()
{
echo $[$1-$2]
}
chengfa()
{
echo $[$1*$2]
}
chufa()
{
if [ $2 -ne 0 ];then
echo $[$1/$2]
else
echo '$2不能为0'
fi
}
//调用函数库
. myfuncs.sh
value1=10
value2=5
result1=`jiafa $value1 $value2`
result2=`jianfa $value1 $value2`
result3=`chengfa $value1 $value2`
result4=`chufa $value1 $value2`
echo "加法结果为$result1"
echo "减法结果为$result2"
echo "乘法结果为$result3"
echo "除法结果为$result4"
Quatro para saída de loop noventa e nove tabuada de multiplicação, diamante
4.1 Tabela de multiplicação
#!/bin/bash
for ((i=1;i<=9;i++)) //外循环控制行数
do
for ((j=1;j<=i;j++)) //内循环控制列数
do
echo -n -e "$i x $j = $((i * j))\t"
done
echo -e "\n"
done
4.2 Diamante
#!/bin/bash
#菱形上半部分
for ((i=9;i>=1;i--)) #控制行数
do
for ((a=1;a<=$i;a++)) #控制第i行第一段输出
do
echo -n " "
done
for ((b=9;b>=$i;b--)) #控制第i行第二段输出
do
echo -n "*"
done
for ((c=8;c>=$i;c--)) #控制第i行第三段输出
do
echo -n "*"
done
echo ""
done
#菱形下半部分
for ((h=2;h<=9;h++))
do
for ((d=1;d<=$h;d++))
do
echo -n " "
done
for ((e=9;e>=$h;e--))
do
echo -n "*"
done
for ((f=8;f>=$h;f--))
do
echo -n "*"
done
echo ""
done