¿Cómo escribir LINUX SHELL?
Escribir scripts es esencial al realizar pruebas de Linux. El nombre del script Shell se puede definir arbitrariamente y no se requiere ningún sufijo. Por ejemplo, puede escribir nombres como abc y smartzip. cuando se ejecute
p>
./smartzip ejecutará el script. .
No es necesario utilizar un espacio al principio de cada línea de comando. .
Parte 1. Conceptos básicos del scripting de Linux
1.1 Introducción básica a la sintaxis
1.1.1 Inicio
El programa debe comenzar con el siguientes líneas Inicio (debe estar en la primera línea del archivo):
#!/bin/sh
El símbolo #! se utiliza para indicarle al sistema que los parámetros detrás de él. se utilizan para ejecutar el programa de archivo. En este ejemplo usamos /bin/sh para ejecutar el programa.
Cuando editas un script, si quieres ejecutarlo, también debes hacerlo ejecutable.
Para hacer que el script sea ejecutable:
Compile el nombre de archivo chmod x para que pueda ejecutarse con ./filename
1.1.2 Comentarios
Al realizar programación de shell, una oración que comienza con # representa un comentario hasta el final de la línea. Recomendamos sinceramente utilizar comentarios en sus programas.
Si utiliza comentarios, podrá comprender la función y el principio de funcionamiento del script en poco tiempo, incluso si no lo ha utilizado durante mucho tiempo.
1.1.3 Variables
En otros lenguajes de programación hay que utilizar variables. En la programación de shell, todas las variables se componen de cadenas y no es necesario declarar variables. Para asignar un valor a una variable, puedes escribir:
#!/bin/sh
#Asignar un valor a una variable:
a=" hola mundo"
# Ahora imprima el contenido de la variable a:
echo "A es:"
echo $a
A veces los nombres de variables son fáciles de confundir con otro texto, como:
num=2
echo "este es el $numnd"
Esto no imprime "este es el segundo" ", pero solo imprime "este es el", porque el shell buscará el valor de la variable numnd, pero esta variable no tiene valor. Puedes usar llaves para indicarle al shell que lo que queremos imprimir es la variable num:
num=2
echo "this is the ${num}nd" p>
Esto se imprimirá: este es el segundo
1.1.4 Variables de entorno
Las variables procesadas por la palabra clave export se denominan variables de entorno. No discutiremos las variables de entorno porque normalmente solo se usan en scripts de inicio de sesión.
1.1.5 Comandos de Shell y control de procesos
Se pueden utilizar tres tipos de comandos en los scripts de Shell:
1) Comandos de Unix:
Aunque cualquier comando de Unix se puede utilizar en un script de shell, todavía hay algunos comandos relativamente más utilizados. Estos comandos se utilizan normalmente para operaciones de archivos y texto.
Sintaxis y funciones de comandos comunes
echo "algo de texto": imprime contenido de texto en la pantalla
ls: lista de archivos
wc -l archivo: cuenta el número de líneas en el archivo
wc -w archivo: cuenta el número de palabras en el archivo
wc -c archivo: cuenta el número de caracteres en el archivo
cp sourcefile destfile: Copiar archivo
mv oldname newname: Cambiar nombre o mover el archivo
rm file: Eliminar el archivo
archivo grep 'pattern': busque una cadena en un archivo, por ejemplo: grep 'cadena de búsqueda' file.txt
cut -b colnum file: especifique el rango de contenido del archivo que se mostrará y envíelos al dispositivo de salida estándar Por ejemplo: generar la primera línea de cada línea Los caracteres del quinto al noveno cortan -b5-9 file.txt no debe confundirse con el comando cat.
Estos son dos completamente diferentes. comandos
cat file.txt: envía el contenido del archivo al dispositivo de salida estándar (pantalla)
archivo somefile: obtiene el tipo de archivo
leer var : Solicitar entrada al usuario y asignar la entrada a la variable
sort file.txt: ordenar las líneas en el archivo file.txt
uniq: eliminar las líneas que aparecen en el archivo de texto Por ejemplo: ordenar archivo.txt | uniq
expr: realizar operación matemática Ejemplo: agregar 2 y 3expr 2 " " 3
buscar: buscar archivos. buscar según el nombre del archivo. -name nombre del archivo -print
tee: datos de salida al dispositivo de salida estándar (pantalla) y al archivo. Por ejemplo: algún comando | tee outfile
archivo de nombre base: devuelve. el nombre del archivo sin una ruta Por ejemplo: nombre base /bin/tux devolverá tux
archivo nombredir: Devuelve la ruta del archivo Por ejemplo: nombredir /bin/tux devolverá /bin
archivo principal: imprime las primeras líneas del archivo de texto
archivo final: imprime las últimas líneas del archivo de texto
sed: Sed es una búsqueda básica y reemplazar el programa. Puede leer texto de la entrada estándar (como una canalización de comandos) y enviar los resultados a la salida estándar (la pantalla). Este comando utiliza expresiones regulares (ver Referencia) para buscar. No confundir con comodines en el shell. Por ejemplo: reemplace linuxfocus con LinuxFocus: cat text.file | sed 's/linuxfocus/LinuxFocus/' gt; newtext.file awk: awk se usa para extraer campos de archivos de texto. De forma predeterminada, el separador de campo es un espacio. Puede utilizar -F para especificar otros separadores.
cat file.txt | awk -F, '{print $1 "," $3}'Aquí usamos, como separador de campos para imprimir el primer y tercer campo al mismo tiempo.
Si el contenido del archivo es el siguiente: Adam Bor, 34, IndiaKerry Miller, 22, EE. UU., el resultado del comando es: Adam Bor, IndiaKerry Miller, EE. UU.
2) Concepto: canalización, redirección y acento grave
Estos no son comandos del sistema, pero son realmente importantes.
La tubería (|) toma la salida de un comando como entrada para otro comando.
grep "hello" file.txt | wc -l
Busque líneas que contengan "hello" en file.txt y cuente el número de líneas.
La salida del comando grep aquí se utiliza como entrada del comando wc. Por supuesto, puedes utilizar varios comandos.
Redirección: genera los resultados del comando en un archivo en lugar de la salida estándar (pantalla).
gt; Escribe en el archivo y sobrescribe el archivo antiguo
gt;gt; Agrega al final del archivo, conservando el contenido del archivo antiguo.
Barra invertida
Utilice la barra invertida para pasar la salida de un comando como argumento de línea de comando a otro comando.
Comando:
find . -mtime -1 -type f -print
Se utiliza para buscar las últimas 24 horas (-mtime –2 significa las últimas 48 horas) archivos modificados. Si desea empaquetar todos los archivos encontrados en un solo paquete, puede utilizar el siguiente script:
#!/bin/sh
# Las marcas son comillas invertidas (`), no comillas normales. ('):
tar -zcvf lastmod.tar.gz `find .mtime -1 -type f -print`
3) Control de procesos
1.if
La expresión "if" ejecutará la parte después de entonces si la condición es verdadera:
si....; .
elif ....; entonces
....
else
....
fi
En la mayoría de los casos, puede utilizar comandos de prueba para probar las condiciones. Por ejemplo, puede comparar cadenas, determinar si un archivo existe y es legible, etc.
Por lo general, "[ ]" se utiliza para representar pruebas condicionales. Tenga en cuenta que los espacios aquí son importantes. Asegúrese de que haya espacios entre corchetes.
[ -f "somefile" ]: determina si es un archivo
[ -x "/bin/ls" ]: determina si /bin/ls existe y tiene permisos ejecutables
[ -n "$var" ]: Determina si la variable $var tiene un valor
[ "$a" = "$b" ]: Determina si $a y $ b son iguales
Ejecute la prueba man para ver todos los tipos que se pueden comparar y juzgar mediante expresiones de prueba.
Ejecute el siguiente script directamente:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; / p>
echo "tu shell de inicio de sesión es bash (bourne again shell)"
else
echo "tu shell de inicio de sesión no es bash sino $SHELL"
fi
La variable $SHELL contiene el nombre del shell de inicio de sesión, que comparamos con /bin/bash.
Operadores de acceso directo
A los amigos que estén familiarizados con el lenguaje C les puede gustar la siguiente expresión:
[ -f "/etc/shadow" ] amp; echo "Esta computadora usa contraseñas ocultas"
Aquí amp; es un operador de acceso directo. Si la expresión de la izquierda es verdadera, se ejecutará la declaración de la derecha.
También puedes considerarlo como la operación AND en operaciones lógicas. El ejemplo anterior indica que si el archivo /etc/shadow existe, se imprimirá "Esta computadora usa contraseñas ocultas". La misma operación OR (||) también está disponible en la programación de shell. Aquí hay un ejemplo:
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "$mailfolder" ] ' '{ echo "No se puede leer $mailfolder" ; exit }
echo "$mailfolder tiene correo de:"
grep "^De " $mailfolder
El script primero determina si la carpeta de correo es legible. Si es legible, imprima la línea "De" en el archivo. Si no es legible, la operación OR entra en vigor y el script se cierra después de imprimir un mensaje de error. Aquí hay un problema, es decir, debemos tener dos comandos:
-Imprimir mensaje de error
-Salir del programa
Usamos llaves para declarar la función anónima El formulario junta dos comandos y los usa como un solo comando. Las funciones generales se mencionan a continuación.
También podemos usar expresiones if para hacer cualquier cosa sin los operadores AND u, pero es mucho más conveniente usar los operadores AND u.
2.case
caso: la expresión se puede utilizar para hacer coincidir una cadena determinada en lugar de un número.
caso... en
...) haz algo aquí;;
esac
Veamos un ejemplo.
El comando file puede identificar el tipo de archivo de un archivo determinado, por ejemplo:
archivo lf.gz
Esto devolverá:
lf.gz: gzip datos comprimidos, desinflados, nombre de archivo original,
Última modificación: lunes 27 de agosto 23:09:18 2001, sistema operativo: Unix
Aprovechamos esto y escribimos un script llamado smartzip, cual El script puede descomprimir automáticamente archivos comprimidos de tipo bzip2, gzip y zip:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" en
"$1: archivo Zip"*)
descomprimir "$1";;
"$1: comprimido gzip"*)< / p>
gunzip "$1" ;;
"$1: bzip2 comprimido"*)
bunzip2 "$1" ;;
*) echo "El archivo $1 no se puede descomprimir con smartzip";
esac
Puedes notar que aquí utilizamos una variable especial $1. Esta variable contiene el valor del primer parámetro pasado al programa.
En otras palabras, cuando ejecutamos:
smartzip artículos.zip
$1 es la cadena artículos.zip
3.
La expresión select es una aplicación de extensión de bash, especialmente buena para uso interactivo. El usuario puede elegir entre un conjunto diferente de valores.
seleccione var en... ; do
break
hecho
.... ahora se puede usar $var. ..
Aquí tienes un ejemplo:
#!/bin/sh
echo "¿Cuál es tu sistema operativo favorito?"
seleccione var en "Linux" "Gnu Hurd" "BSD gratuito" "Otro"; do
break
done
echo "Has seleccionado $var"
El siguiente es el resultado de ejecutar el script:
¿Cuál es tu sistema operativo favorito?
1) Linux
2) Gnu Hurd
3) BSD gratuito
4) Otro
# 1
Has seleccionado Linux
4. bucle
expresión de bucle:
mientras...; hacer
....
hecho
while-loop se ejecutará hasta que la expresión sea verdadera. se ejecutará mientras la expresión que probamos sea verdadera.
La palabra clave "break" se utiliza para salir del bucle. La palabra clave "continuar" se utiliza para saltar directamente al siguiente bucle sin ejecutar la parte restante.
La expresión del bucle for mira una lista de cadenas (cadenas separadas por espacios) y la asigna a una variable:
for var in ....; > p>
....
hecho
En el siguiente ejemplo, ABC se imprimirá en la pantalla respectivamente:
#!/bin / sh
for var in A B C; do
echo "var is $var"
done
Lo siguiente es más útil El script showrpm, su función es imprimir información estadística de los paquetes RPM:
#!/bin/sh
# enumera un resumen del contenido de varios paquetes RPM
# USO: showrpm rpmfile1 rpmfile2 ...
# EJEMPLO: showrpm /cdrom/RedHat/RPMS/*.rpm
para paquete rpm en $*; p>
if [ -r "$rpmpackage" ]; entonces
echo "================ $rpmpackage ======= === ===="
rpm -qi -p $rpmpackage
else
echo "ERROR: no se puede leer el archivo $rpmpackage"
fi
hecho
Aquí aparece la segunda variable especial $*, que contiene los valores de todos los parámetros de línea de comando ingresados.
Si ejecuta showrpm openssh.rpm w3m.rpm webgrep.rpm
En este momento $* contiene 3 cadenas, a saber, openssh.rpm, w3m.rpm y webgrep.rpm.
5. Comillas
El programa expande los comodines y las variables antes de pasar cualquier parámetro al programa. La llamada expansión aquí significa que el programa reemplazará los caracteres comodín (como *) con nombres de archivo apropiados y reemplazará las variables con valores de variable. Para evitar que el programa realice esta sustitución, puede utilizar comillas: Veamos un ejemplo, suponiendo que hay algunos archivos en el directorio actual, dos archivos jpg, mail.jpg y tux.jpg.
1.2 Compilar script SHELL
#ch#!/bin/sh mod x filename
cho *.jpg ∪ 螞袁荜蚙耄? /filename para ejecutar. tu guión.
Esto imprimirá los resultados de "mail.jpg tux.jpg".
Las comillas (comillas simples y dobles) evitarán esta expansión de comodines:
#!/bin/sh
echo "*.jpg"
p>echo '*.jpg'
Esto imprimirá "*.jpg" dos veces.
Las comillas simples son más restrictivas. Previene cualquier expansión variable. Las comillas dobles evitan la expansión con comodines pero permiten la expansión variable.
#!/bin/sh
echo $SHELL
echo "$SHELL"
echo '$SHELL'
El resultado de la ejecución es:
/bin/bash
/bin/bash
$SHELL
Finalmente, hay Una forma de evitar esta expansión es utilizar el carácter de escape, la barra invertida:
echo /*.jpg
echo /$SHELL
Esto generará :
*.jpg
$SHELL
6. Aquí documentos
Al pasar varias líneas de texto a un Al ordenar, aquí. documentos (Nota del traductor: todavía no he visto una traducción adecuada de esta palabra) es un buen método. Es útil escribir un texto útil para cada script. En este momento, si tenemos los documentos aquí, no tenemos que usar la función de eco para generar línea por línea. Un "documento Here"
documento here es un bloque de código de propósito especial que utiliza la redirección de E/S para pasar una secuencia de comandos a un programa o comando interactivo, como ftp, cat o ex editor de texto. .
1 COMANDO
la cadena de límite se utiliza para delinear el rango de la secuencia de comandos (Nota del traductor: la secuencia de comandos está entre dos cadenas de límite idénticas) .
El formato del documento aquí se parece al siguiente:
1 #!/bin/bash
2 programa-interactivo
Elegir una cadena de límite con un nombre muy extraño evitará el problema de nombres duplicados de la lista de comandos y la cadena límite.
El siguiente es un ejemplo en el que cambiamos el nombre de varios archivos y utilizamos aquí los documentos para imprimir la ayuda: <. /p>
#!/bin/sh
# tenemos menos de 3 argumentos Imprime el texto de ayuda:
if [ $# -lt 3 ]; /p>
cat
4) Función
Si escribe algunos programas un poco más complejos, encontrará que en el programa El mismo código se puede usar en varios lugares. y también encontrarás que será mucho más conveniente si usamos funciones. Una función se ve así:
nombrefunción()
{
# dentro del cuerpo $1 es el primer argumento dado a la función
# $2 el segundo...
cuerpo
}
Necesitas declarar la función al comienzo de cada programa.
Aquí hay un script llamado xtitlebar, usando este script puedes cambiar el nombre de la ventana del terminal.
Aquí se utiliza una función llamada ayuda. Como puede ver, esta función definida se usa dos veces.
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
desplazamiento de gato en 2
--) desplazamiento; descanso;; # fin de opciones
-*) echo "error: no existe tal opción $1. - h para ayuda"; salida 1;;
*) break;;
esac
done
echo "opt_f es $opt_f "
echo "opt_l es $opt_l"
echo "el primer argumento es $1"
echo "el segundo argumento es $2"
Puede ejecutar el script de esta manera:
cmdparser -l hello -f -- -somefile1 somefile2
El resultado devuelto es:
opt_f es 1 p >
opt_l es hola
el primer argumento es -algún archivo1
el segundo argumento es algún archivo2
¿Cómo funciona este script? El script primero recorre todos los parámetros de la línea de comando de entrada, compara los parámetros de entrada con la expresión de caso, establece una variable y elimina el parámetro si hay una coincidencia. Según la convención de los sistemas Unix, el primer parámetro ingresado debe ser el parámetro que contiene el signo menos.
Ejemplo de la Parte 2
Ahora discutiremos los pasos generales para escribir un script. Cualquier buen script debe tener ayuda y parámetros de entrada. Y es una muy buena idea escribir un pseudo script (framework.sh) que contenga la estructura del marco requerida por la mayoría de los scripts. En este momento, al escribir un nuevo script, solo necesitamos ejecutar el comando de copia:
cp framework.sh myscript
Luego inserte nuestra propia función.
Veamos dos ejemplos más:
(1) Conversión de binario a decimal
El script b2d convierte un número binario (como 1101) en el correspondiente Número decimal. Este también es un ejemplo del uso del comando expr para realizar operaciones matemáticas:
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat
Parte 3: Depuración
El comando de depuración más simple es, por supuesto, el echo dominio. Puede utilizar echo para imprimir cualquier valor de variable siempre que sospeche que algo salió mal. Esta es la razón por la que la mayoría de los programadores de shell dedican el 80% de su tiempo a depurar programas. La ventaja del programa shell es que no es necesario volver a compilarlo y no lleva mucho tiempo insertar un comando de eco.
El shell también tiene un modo de depuración real. Si hay errores en el script "strangescript", puedes depurarlo así:
sh -x Strangescript
Esto ejecutará el script y mostrará los valores de todas las variables. .
El shell también tiene un modo que no requiere ejecutar el script sino que simplemente verifica la sintaxis.
Se puede utilizar así:
sh -n your_script
Esto devolverá todos los errores de sintaxis
Depurar el proceso del programa shell
El usuario acaba de terminar de escribir En un programa de shell, los errores son inevitables. En este momento, podemos usar la opción de seguimiento proporcionada en Bsh, que mostrará el comando y los parámetros que acabamos de ejecutar. Los usuarios pueden activar la opción -x mediante el comando set o usar la opción -x al iniciar Shell para configurar Shell en modo de seguimiento. Por ejemplo, el siguiente código ice_tx:
if [ $# -eq 0 ]
entonces
echo "usage:sumints integer list"
Salir 1
fi
sum=0
hasta [ $# -eq 0 ]
hacer
sum='expr $sum $1'
shift
done
echo $sum
Ejecutamos en modo rastreo:
p>$sh -x ice_tx 2 3 4
El resultado muestra:
[ 3 -eq 0 ]
suma= 0
[ 3 -eq 0 ]
expr 0 2
suma=2
cambio
[ 2 -eq 0 ]
expr 2 3
suma=5
cambio
[ 1 -eq 0 ]
expr 5 4
suma=9
[ 0 -eq 0 ]
eco 9
9
Desde arriba se puede ver que en el modo de seguimiento, el Shell muestra cada comando ejecutado y los valores de los parámetros después de reemplazar las variables utilizadas por el comando. Algunas palabras de control como si, entonces, hasta, etc. no se muestran.