Funciones y declaraciones de ciclo de programación de shell
Una declaración de eco
1.1 Echo caracteres de escape de uso común
Echo -n significa salida sin
saltos de línea . Echo -e genera caracteres de escape y envía el contenido de escape a la pantalla
Personajes de escape comunes | Paráfrasis |
---|---|
\si | Después de escapar, es equivalente a presionar la tecla de retroceso (retroceso), pero solo si hay caracteres después de "\ b"; "\ b" significa eliminar el carácter anterior y "\ b \ b" significa eliminar los dos primeros caracteres. |
\C | Salida sin salto de línea. Cuando no hay caracteres después de "\ c", el efecto es equivalente a echo -n; pero cuando todavía hay caracteres después de "\ c", los caracteres después de "\ c" no se mostrarán. |
\norte | Salto de línea, los caracteres que se van a generar comienzan en una nueva línea desde "\ n". |
\ v o \ f | Salto de línea, pero el comienzo de la nueva línea después del salto de línea está conectado al final de la línea anterior |
\ t | Medios para insertar pestaña, es decir, pestaña horizontal; |
\ r | El cursor se mueve al principio de la línea, pero no se ajusta, lo que equivale a usar los caracteres después de "\ r" para sobrescribir los caracteres de la misma longitud antes de "\ r", pero cuando no hay ningún carácter después de "\ r", el que está antes de "\ r" Los caracteres no se sobrescribirán |
\\ | Medios para insertar "\" en sí |
Ejemplo de operación
1.2 Método de cálculo
Hay 4 métodos de cálculo en el 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]
Declaración de dos bucles
2.1 para bucle
Cuando utilice una instrucción de bucle for, debe especificar una variable y una lista de valores posibles, y ejecutar la misma secuencia de comandos repetidamente para cada valor diferente hasta que se agote el valor de la variable y se salga por completo del bucle. Aquí, la lista de valores es la condición de ejecución de la instrucción for, que incluye varios objetos con los mismos atributos, que deben especificarse de antemano.
2.1.1 para formato de bucle
for 变量名 in 取值列表
do
命令序列
done
Ejemplo: agregar usuario y eliminar usuario
#!/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 Interrupción de bucle (interrumpir, continuar)
De forma predeterminada, romper saltos de un solo bucle, romper 2 saltos de dos bucles, y así sucesivamente, romper n saltos de n bucles.
continuar termina un comando en un bucle, pero no termina por completo el bucle completo
2.1.3 Tres métodos de bucle 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 bucle while
while 条件测试操作
do
命令序列
done
Ejemplo: adivina el precio de la mercancía
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 hasta bucle
Pruebe una determinada condición repetidamente y ejecútela repetidamente siempre que la condición no esté establecida
until 条件测试操作
do
命令序列
done
Ejemplo: acumular desde 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
Tres funciones
Definición de función
[function] 函数名 ()
{
命令序列
[return x]
}
Funciones de llamada
函数名 [参数1] [参数2]
3.1 Valor de retorno de la función
Retorno significa salir de la función y devolver un valor de salida. Puede utilizar la variable para mostrar el valor en el script. Principios de uso del valor: 1 Tome el valor de retorno tan pronto como finalice la función, porque el principio de utilizar la variable para mostrar el valor: 1 Tome el valor de retorno tan pronto como finalice la función ,porque? La cantidad variable que se muestra de forma significativa, el valor hace uso del original es : un número de función de una viga de unión para tomar regresa al valor , porque como ? La variable devuelve solo el último comando ejecutado estado
de salida 2 código de estado de salida debe ser 0-255, más allá Al dividir por 256, toma el resto
db()
{
read -p "input:" value
return $[$value * 2]
}
db
echo $?
3.2 Función recursiva
La función recursiva se llama a sí misma. Al analizar la función, puede omitir la llamada a la función y luego analizar la parte.
Ejemplo: atravesar directorios y archivos ejecutables de forma recursiva en variables de entorno
#!/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 Creación y llamada de biblioteca de funciones
Ejemplo: biblioteca de funciones de suma, resta, multiplicación y división
创建函数库
[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"
Cuatro para la tabla de multiplicar del noventa y nueve de la salida del lazo, diamante
4.1 Tabla de multiplicar
#!/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