Com passar els arguments a un script Bash

Ordres, sintaxi i exemples

Podeu escriure un script bash de manera que rebi arguments especificats quan es crida l'script des de la línia d'ordres. Aquest mètode s'utilitza quan un script té una funció lleugerament diferent segons els valors dels paràmetres d'entrada (els arguments).

Per exemple, pot tenir un script anomenat "stats.sh" que realitza una operació particular en un fitxer, com comptar les seves paraules. Si voleu utilitzar aquest script en molts fitxers, el millor és passar el nom del fitxer com a argument, de manera que podeu utilitzar el mateix script per a tots els fitxers que es processaran. Per exemple, si el nom del fitxer a processar és "songlist", introduïu la línia d'ordres següent:

sh stats.sh timglista

S'inclouen arguments dins d'un script amb les variables $ 1, $ 2, $ 3, etc., on $ 1 fa referència al primer argument, $ 2 al segon argument, etc. Això es mostra en el següent exemple:

FILE1 = $ 1 wc $ FILE1

Per a la llegibilitat, assigneu una variable amb un nom descriptiu al valor del primer argument ($ 1), i després truqueu a la utilitat de recompte de paraules ( wc ) en aquesta variable ($ FILE1).

Si teniu un nombre variable d'arguments, podeu utilitzar la variable "$ @", que és una matriu de tots els paràmetres d'entrada. Això significa que podeu utilitzar un for-loop per processar iterativament cadascun, tal com es mostra en el següent exemple:

per FILE1 a "$ @" fa wc $ FILE1 fet

Aquí teniu un exemple de com trucar a aquest script amb arguments des de la línia d'ordres:

sh stats.sh songlist1 songlist2 songlist3

Si un argument té espais, heu d'incloure'l amb cometes simples. Per exemple:

sh stats.sh 'songlist 1' 'songlist 2' 'songlist 3'

Sovint, un script està escrit de tal manera que l'usuari pot transmetre arguments en qualsevol ordre amb banderes. Amb el mètode de flags, també podeu fer que alguns dels arguments siguin opcionals.

Deixeu-vos dir que teniu un script que recupera informació d'una base de dades basada en paràmetres específics, com ara "nom d'usuari", "data" i "producte" i genera un informe en un "format" especificat. Ara voleu escriure el vostre script perquè pugueu passar aquests paràmetres quan es crida l'script. Podria tenir aquest aspecte:

makereport -u jsmith -p portàtils -d 10-20-2011 -f pdf

Bash habilita aquesta funcionalitat amb la funció "getopts". Per a l'exemple anterior, podeu utilitzar els getopts de la manera següent:

Es tracta d'un bucle temporal que utilitza la funció "getopts" i un anomenat "optstring", en aquest cas "u: d: p: f:", per recórrer en iteració a través dels arguments. El bucle while passa per l'optstring, que conté els indicadors que es poden utilitzar per passar arguments, i assigna el valor d'argument proporcionat per aquest indicador a la variable "option". La declaració del cas assigna el valor de la variable "opció" a una variable global que es pot utilitzar després de llegir tots els arguments.

Els colons de l'optstring fan que es requereixin valors per als indicadors corresponents. A l'exemple anterior, tots els indicadors són seguits d'un punt de coma: "u: d: p: f:". Això significa que totes les banderes necessiten un valor. Si, per exemple, els paquets "d" i "f" no s'espera que tinguin un valor, l'optstring seria "u: dp: f".

Un còlon al principi de l'optstring, per exemple ": u: d: p: f:", té un significat completament diferent. Us permet gestionar els indicadors que no estan representats a l'optstring. En aquest cas, el valor de la variable "opció" s'estableix a "?" i el valor de "OPTARG" s'estableix a l'indicador inesperat. Us permet mostrar un missatge d'error adequat que informa l'usuari de l'error.

Els arguments que no precedeixen una bandera són ignorats per getopts. Si els indicadors especificats a l'optstring no es proporcionen quan es crida l'script, no passa res, tret que hàgiu manejat especialment aquest cas en el vostre codi. Qualsevol argument que no sigui gestionat per getops encara es pot capturar amb les variables regulars de $ 1, $ 2, etc.