Como parte de nuestra serie de tutoriales de bash en curso, discutimos sobre los parámetros posicionales de bash en nuestro artículo anterior. En este artículo, analicemos los parámetros especiales de bash con algunos ejemplos prácticos de scripts de shell.
Algunos de los parámetros especiales de bash que discutiremos en este artículo son:$*, $@, $#, $$, $!, $?, $-, $_
Para acceder a la lista completa de parámetros posicionales, están disponibles los dos parámetros especiales $* y $@. Fuera de las comillas dobles, estos dos son equivalentes:ambos se expanden a la lista de parámetros posicionales que comienzan con $1 (separados por espacios).
Dentro de las comillas dobles, sin embargo, difieren:$* dentro de un par de comillas dobles es equivalente a la lista de parámetros posicionales, separados por el primer carácter de IFS “$1c$2c$3…”.
$@ dentro de un par de comillas dobles es equivalente a la lista de parámetros posicionales, separados por espacios sin comillas, es decir, “$1” “$2″..”$N”.
Ejemplo 1:use Bash $* y $@ para expandir los parámetros posicionales
Este ejemplo muestra el valor disponible en $* y $@.
Primero, cree el expan.sh como se muestra a continuación.
$ cat expan.sh #!/bin/bash export IFS='-' cnt=1 # Printing the data available in $* echo "Values of \"\$*\":" for arg in "$*" do echo "Arg #$cnt= $arg" let "cnt+=1" done cnt=1 # Printing the data available in $@ echo "Values of \"\$@\":" for arg in "$@" do echo "Arg #$cnt= $arg" let "cnt+=1" done
A continuación, ejecute expan.sh como se muestra a continuación para ver cómo funcionan $* y $@.
$ ./expan.sh "This is" 2 3 Values of "$*": Arg #1= This is-2-3 Values of "$@": Arg #1= This is Arg #2= 2 Arg #3= 3
- La secuencia de comandos anterior exportó el valor de IFS (separador de campo interno) con el '-'.
- Hay tres parámetros pasados al script expan.sh $1=”Esto es”,$2=”2″ y $3=”3″.
- Al imprimir cada valor del parámetro especial "$*", da solo un valor que es el parámetro posicional completo delimitado por IFS.
- Mientras que "$@" te da cada parámetro como una palabra separada.
Ejemplo 2:Usar $# para contar parámetros posicionales
$# es el parámetro especial en bash que le da el número de parámetros posicionales en decimal.
Primero, cree aritmetic.sh como se muestra a continuación.
$ cat arithmetic.sh #!/bin/bash if [ $# -lt 2 ] then echo "Usage: $0 arg1 arg2" exit fi echo -e "\$1=$1" echo -e "\$2=$2" let add=$1+$2 let sub=$1-$2 let mul=$1*$2 let div=$1/$2 echo -e "Addition=$add\nSubtraction=$sub\nMultiplication=$mul\nDivision=$div\n"
Si el número de parámetros posicionales es inferior a 2, arrojará la información de uso como se muestra a continuación,
$ ./arithemetic.sh 10 Usage: ./arithemetic.sh arg1 arg2
Ejemplo 3:Parámetros relacionados con el proceso:$$ y $!
El parámetro especial $$ dará el ID de proceso del shell. ps le brinda la identificación del proceso en segundo plano ejecutado más recientemente.
El siguiente script imprime la identificación del proceso del shell y ejecuta la última identificación del proceso en segundo plano.
$ cat proc.sh #!/bin/bash echo -e "Process ID=$$" sleep 1000 & echo -e "Background Process ID=$!"
Ahora, ejecute el script anterior y verifique la identificación del proceso que está imprimiendo.
$ ./proc.sh Process ID=9502 Background Process ID=9503 $ ps PID TTY TIME CMD 5970 pts/1 00:00:00 bash 9503 pts/1 00:00:00 sleep 9504 pts/1 00:00:00 ps $
Ejemplo 4:Otros parámetros especiales de Bash:$?, $-, $_
- $? Proporciona el estado de salida del comando ejecutado más recientemente.
- $- Opciones configuradas usando el comando interno set
- $_ Da el último argumento al comando anterior. En el inicio del shell, proporciona el nombre de archivo absoluto del script de shell que se está ejecutando.
$ cat others.sh #!/bin/bash echo -e "$_"; ## Absolute name of the file which is being executed /usr/local/bin/dbhome # execute the command. #check the exit status of dbhome if [ "$?" -ne "0" ]; then echo "Sorry, Command execution failed !" fi echo -e "$-"; #Set options - hB echo -e $_ # Last argument of the previous command.
En el script anterior, la última declaración de eco “echo -e $_” ($ guión bajo) también imprime hB, que es el valor del último argumento del comando anterior. Entonces $_ dará el valor después de la expansión
$ ./others.sh ./others.sh /home/oracle Sorry, Command execution failed ! hB hB