Comando integrado de bash shift

comando de cambio

En Tipo Unix sistemas operativos, cambiar es un comando incorporado del Intento cáscara. Cuando se ejecuta, cambia el parámetros posicionales (como los argumentos pasados ​​a un bash texto ) a la izquierda, colocando cada parámetro en una posición inferior.

Descripción

Cuando corres cambiar , los parámetros posicionales actuales se desplazan a la izquierda norte veces. Parámetro posicional x se le da el valor del parámetro x + norte . Si parámetro x + norte no existe, parámetro x es desarmado .

Si no se especifica, el valor predeterminado de norte es 1 . Entonces los comandos ' turno 1 ' y ' cambiar '(sin argumento) haga lo mismo.

Si un parámetro se desplaza a una posición con un número menor que 1, se 'cae': su valor se descarta. Entonces el comando cambiar siempre descarta el valor anterior de $1 , y turno 2 siempre descarta los valores anteriores de $1 y $2 .

El parámetro posicional especial $0 está excluido de todas las operaciones de turno y nunca modificado por el cambiar mando.

Sintaxis

|_+_|

La cambiar El comando toma solo un argumento:

norte El número de posiciones en las que los parámetros deben desplazarse hacia la izquierda. Este valor puede ser cualquier número entero no negativo. Si norte es cero 0 ), no se realizará ningún cambio de parámetro. El valor predeterminado de norte es 1 .

Estado de salida

Cuándo cambiar salidas, devuelve un estado de salida de 0 (sin error), a menos que: norte es negativo, o norte es mayor que el número actual de parámetros posicionales, en cuyo caso el estado de salida es distinto de cero.

Parámetros posicionales en bash

En bash, siempre que se ejecuta un comando, el entorno para ese comando incluye variables especiales que contienen los parámetros individuales dados al comando.

El nombre de estas variables es un número, que corresponde a la posición de ese parámetro en la línea de comando.

Por ejemplo, considere el siguiente comando:

|_+_|

Este comando tiene tres parámetros posicionales, numerados de la siguiente manera:

Parámetro Posición Descripción
mv 0 La comando mv , que mueve archivos. En este caso, cambia el nombre file_old.txt a file_new.txt 'moviéndolo' a lo nuevo Nombre del archivo .
file_old.txt 1 El nombre del archivo original.
file_new.txt 2 El nuevo nombre de archivo.

El primer parámetro, 0 , contiene el nombre del comando. Si no hay argumentos, este será el único parámetro posicional.

Cuando se incluyen argumentos después de un comando, cada uno se almacena en las variables de shell denominadas 1 , 2 , etc. Como cualquier otra variable de shell, se puede hacer referencia a su valor poniendo un signo de dólar antes del nombre de la variable. Entonces el valor del parámetro posicional 1 se puede hacer referencia con $1 , el valor del parámetro 2 se puede hacer referencia con $2 , etc.

Parámetros con un número 10 o mayor puede ser referenciado poniendo el número entre paréntesis, por ejemplo ${10} , ${11} , o ${12345} .

Bash realiza un seguimiento del número total de parámetros posicionales. Este número se almacena en la variable de shell especial $# .

El valor de $# disminuye en norte cada vez que corres cambiar .

Parámetro posicional especial cero

Parámetro posicional cero ( 0 ) contiene el nombre del comando que se utilizó para iniciar el proceso actual, tal como se ejecutó. Siempre puede averiguar qué comando se utilizó para iniciar el proceso actual comprobando el valor de esta variable.

Por ejemplo: desde un indicador de bash, puede ejecutar echo $0 para ver el comando que inició su sesión actual de bash:

|_+_| |_+_|

Esta es la ubicación de la fiesta ejecutable .

Sin embargo, existen diferentes formas de ejecutar un archivo ejecutable; por ejemplo, muchos programas se ejecutan mediante un enlace simbólico (enlace simbólico). Si ejecuta un comando con un enlace simbólico, $0 contiene el nombre del enlace que usó.

Por ejemplo, puede crear un enlace simbólico para intento en su directorio de inicio:

|_+_|

Y haga que el enlace simbólico sea ejecutable, usando chmod :

|_+_|

Luego, puede iniciar un nuevo proceso hijo de bash ejecutando el enlace simbólico:

|_+_|

Ahora estás en un nuevo shell bash, dentro de tu shell anterior. Si tu corres echo $0 , verás la diferencia:

|_+_| |_+_|

Esta es la ruta completa a su directorio de inicio, como la expandió bash cuando usó el alias ~ (a tilde ). Puedes escribir Salida ahora, para volver a su shell bash original.

Ejemplos de

Cambio de parámetros

Creemos un script que acepte argumentos. Veremos cómo se almacenan los argumentos en el entorno como parámetros posicionales y cómo cambiar les afecta.

Cree una nueva secuencia de comandos con su editor de texto favorito, como pico o vim. El guión debería verse así:

|_+_|

La primera línea, que comienza con #! (un 'shebang') define qué programa de shell debe usarse para ejecutar el script.

La segunda línea (' turno 0 ') no hace nada, todavía. Después de ejecutar el script de esta manera, cambiaremos 0 a otro número.

Ahora, guarde esto en un archivo llamado myargs.sh y salga del editor de texto.

Fabricar myargs.sh ejecutable:

|_+_|

Luego ejecútalo y dale algunos argumentos:

|_+_| |_+_|

En esta salida, podemos ver los valores de los parámetros posicionales. 04 . (El valor de $5 es ' cinco ', pero no estamos usando ese valor en nuestro script).

Estos valores son específicos de nuestro comando actual: el script. Cuando finaliza la secuencia de comandos, estos valores vuelven a sus valores antes de que se ejecutara la secuencia de comandos. Entonces, ahora, en el símbolo del sistema, puede ejecutar:

|_+_| |_+_|

Estos son los valores de nuestra sesión bash. $0 es la ubicación del ejecutable bash y los otros parámetros no tienen valor.

Ahora cambiemos turno 0 a turno 1 . Abra la secuencia de comandos en su editor de texto y cambie la segunda línea para que la secuencia de comandos se vea así:

|_+_|

Todo después de la marca de almohadilla (' # ') en la línea 2 es un comentario y se ignora cuando se ejecuta el script.

Guarde el archivo y salga del editor de texto. Luego, ejecute el script nuevamente:

|_+_| |_+_|

Observe que la posición de todos los parámetros se desplaza hacia abajo en uno. El valor original de $1 fue descartado, y el valor de $5 está ahora en $4 . El valor de $0 no ha cambiado.

Pero, corriendo cambiar solo una vez no es muy útil. Por lo general, querrá ejecutarlo varias veces, en un bucle. Podemos reescribir el script anterior como un bucle, donde cada iteración cambia los parámetros una vez. En su editor de texto, cambie la secuencia de comandos para que se vea así:

|_+_|

Darse cuenta de cambiar es el último comando del ciclo. Esto nos permite hacer algo con los parámetros antes de cambiarlos. Luego, como paso final, cambiamos los parámetros y ejecutamos el ciclo nuevamente.

Guarde sus cambios, salga del editor de texto y ejecute el script. Se repetirá cinco veces (con I incrementándose desde 0 a 4 , una vez por bucle). Cada ciclo cambiará los valores una vez y hará eco de los valores 04 a la terminal.

|_+_| |_+_|

Ahora que hemos visto cómo se cambian los parámetros, creemos un script con un propósito práctico.

Ejemplo del mundo real

El siguiente guión, clean-old-files.sh , acepta una lista de directorio nombres como parámetros en la línea de comando. Escanea cada directorio nombrado en busca de archivos a los que no se haya accedido en más de un año y los elimina.

|_+_|

Veamos las partes individuales de este script y analicemos lo que hacen:

|_+_|

En esto Si sentencia condicional , el script comprueba si hay argumentos. La prueba utiliza notación de un solo corchete ( [ & hellip; ] ), que es equivalente a usar el comando incorporado prueba . La variable de shell especial $# contiene el número total de parámetros posicionales. Si su valor es igual a cero, eso significa que el usuario no proporcionó ningún nombre de directorio, por lo que hacemos eco de un mensaje de ayuda y finalizamos el script con un error (estado de salida 1 ).

|_+_|

De lo contrario, procedemos al exterior tiempo bucle, que utiliza la evaluación de doble paréntesis para ver si $# es verdadero, es decir, si su valor es distinto de cero. Cada vez que comienza el ciclo, si $# es cero, la expresión se evalúa como falsa y el ciclo sale.

Consejo

Las expresiones (( '$#' )) y [ '$#' != '0' ] dan resultados equivalentes y son funcionalmente intercambiables.

A continuación, veamos ambos lados del bucle while interno:

|_+_|

Esta línea dice: mientras haya leer elementos que son delimitado ( -D ) por un carácter nulo ( $'' ), lee un elemento en la variable expediente , luego ejecute los comandos dentro del ciclo.

Los elementos son proporcionados por la línea al final del ciclo:

|_+_|

Esta línea dice: encontrar todos los archivos, comenzando la búsqueda en el directorio dir1 (en parámetro posicional $1 ), a los que se accedió por última vez ( -un momento ) más que ( + ) 365 hace días. Delimite la lista de nombres de archivo coincidentes con caracteres nulos ( -print0 ).

La encontrar El comando está encerrado en <( & hellip; ) , que usa sustitución de procesos para tratar la salida como si fuera un archivo. El contenido de este 'archivo' se redirige ( < ) al bucle interno while. Allí, leer interpreta todo hasta un carácter nulo como el siguiente nombre de archivo y asigna este nombre a la variable expediente . Luego, se ejecuta el interior del bucle:

|_+_|

Que imprime el nombre del archivo y elimina el archivo.

El bucle interno continúa hasta que no hay más nombres de archivo, por lo que leer devuelve falso. El bucle interior sale al bucle exterior, donde, nosotros ...

|_+_|

cambiar los parámetros posicionales, de modo que dir2 ( $2 ) es ahora dir1 ( $1 ). El viejo $1 se descarta, y $# se reduce automáticamente en 1.

|_+_|

Vuelve al principio de lo externo. tiempo círculo. Si no hay más parámetros posicionales, la prueba (( '$#' )) devuelve falso, el bucle exterior sale y ...

|_+_|

Salimos con éxito (estado de salida 0 ).

La ejecución del script se ve así:

|_+_| |_+_|

getopts - Analizar argumentos pasados ​​a un script de shell.