Com treballar amb variables a Bash
Les variables són vitals si voleu escriure scripts i entendre què farà al vostre ordinador Linux aquell codi que esteu a punt de retallar i enganxar del web. Us posarem en marxa!
Variables 101
Les variables són símbols amb nom que representen una cadena o un valor numèric. Quan els feu servir en ordres i expressions, es tracten com si haguéssiu escrit el valor que contenen en lloc del nom de la variable.
Per crear una variable, només cal que proporcioneu un nom i un valor. Els vostres noms de variables han de ser descriptius i us recorden el valor que tenen. Un nom de variable no pot començar amb un número ni pot contenir espais. Tanmateix, pot començar amb un subratllat. A part d’això, podeu utilitzar qualsevol barreja de caràcters alfanumèrics en majúscules i minúscules.
Exemples
Aquí crearem cinc variables. El format és escriure el nom, el signe igual =
, i el valor. Tingueu en compte que no hi ha cap espai abans ni després del signe igual. Sovint es dóna valor a una variable assignació un valor a la variable.
Crearem quatre variables de cadena i una variable numèrica,aquest any:
jo = Dave
my_boost = Linux
ell = Popeye
his_boost = Espinacs
any aquest = 2019
Per veure el valor que es té en una variable, utilitzeu el fitxer ressò
comandament. Heu de precedir el nom de la variable amb un signe de dòlar $
sempre que feu referència al valor que conté, tal com es mostra a continuació:
feu ressò de $ my_name
feu ressò de $ my_boost
feu ressò de $ aquest any
Utilitzem totes les nostres variables alhora:
echo "$ my_boost is to $ me as $ his_boost is to $ him (c) $ this_year"
Els valors de les variables substitueixen els seus noms. També podeu canviar els valors de les variables. Per assignar un valor nou a la variable,my_boost
, només repetiu el que vau fer quan vau assignar el seu primer valor, així:
my_boost = Tequila
Si torneu a executar l'ordre anterior, ara obtindreu un resultat diferent:
echo "$ my_boost is to $ me as $ his_boost is to $ him (c) $ this_year"
Per tant, podeu utilitzar la mateixa ordre que fa referència a les mateixes variables i obtenir resultats diferents si canvieu els valors de les variables.
Més endavant parlarem de citar variables. De moment, aquí teniu algunes coses que cal recordar:
- Una variable entre cometes simples
'
es tracta com una cadena literal i no com una variable. - Variables entre cometes
"
es tracten com a variables. - Per obtenir el valor mantingut en una variable, heu de proporcionar el signe del dòlar
$
. - Una variable sense el signe del dòlar
$
només proporciona el nom de la variable.
També podeu crear una variable que prengui el seu valor d'una variable existent o d'un nombre de variables. L'ordre següent defineix una nova variable anomenada beure_de_any,
i li assigna els valors combinats del fitxer my_boost
i aquest any
les variables:
drink_of-the_Year = "$ my_boost $ this_year"
ressò beu_de_any
Com s'utilitzen les variables als scripts
Els scripts estarien completament obstaculitzats sense variables. Les variables proporcionen la flexibilitat que fa que un script sigui una solució general i no específica. Per il·lustrar la diferència, aquí teniu un script que compta els fitxers de / dev
directori.
Escriviu-lo en un fitxer de text i deseu-lo com a fcnt.sh
(per al "recompte de fitxers"):
#! / bin / bash folder_to_count = / dev file_count = $ (ls $ folder_to_count | wc -l) echo $ file_count fitxers a $ folder_to_count
Abans de poder executar l'script, heu de fer-lo executable, tal com es mostra a continuació:
chmod + x fcnt.sh
Escriviu el següent per executar l'script:
./fcnt.sh
Imprimeix el nombre de fitxers al fitxer / dev
directori. A continuació s’explica com funciona:
- Una variable anomenada
carpeta_per_comptar
està definit i està configurat per contenir la cadena "/ dev". - Una altra variable, anomenada
fitxer_compte
, es defineix. Aquesta variable pren el seu valor d'una substitució d'ordres. Aquesta és la frase d'ordres entre parèntesis$( )
. Tingueu en compte que hi ha un signe de dòlar$
abans del primer parèntesi. Aquesta construcció$( )
avalua les ordres entre parèntesis i, a continuació, retorna el seu valor final. En aquest exemple, aquest valor s'assigna al fitxerfitxer_compte
variable. Quant alfitxer_compte
variable, es transmet un valor a mantenir; no es preocupa per com es va obtenir el valor. - L'ordre avaluada en la substitució de l'ordre realitza un
ls
llistat de fitxers al directori del fitxercarpeta_per_comptar
variable, que s'ha definit a "/ dev". Per tant, l'script executa l'ordre "ls / dev". - La sortida d 'aquesta ordre es condueix al fitxer
wc
comandament. El-l
causes de l'opció (recompte de línies)wc
per comptar el nombre de línies a la sortida del fitxerls
comandament. Com que cada fitxer apareix en una línia independent, aquest és el recompte de fitxers i subdirectoris del directori "/ dev". Aquest valor s'assigna al fitxerfitxer_compte
variable. - La línia final utilitza eco per generar el resultat.
Però això només funciona per al directori "/ dev". Com podem fer que el guió funcioni amb qualsevol directori? Només cal un petit canvi.
Com s'utilitzen els paràmetres de la línia d'ordres als scripts
Moltes ordres, com ara ls
i wc
, agafeu paràmetres de línia d'ordres. Aquests proporcionen informació a l'ordre, de manera que sap què voleu que faci. Si volsls
per treballar al directori inicial i també per mostrar fitxers ocults, podeu utilitzar l'ordre següent, on es troba el títol ~
i la -a
(tots) l'opció són paràmetres de línia d'ordres:
ls ~ -a
Els nostres scripts poden acceptar paràmetres de línia d'ordres. S’hi fa referència com $1
per al primer paràmetre, $2
com el segon, i així successivament, fins a $9
per al novè paràmetre. (De fet, n’hi ha un $0
, també, però està reservat per mantenir sempre el guió.)
Podeu fer referència als paràmetres de la línia d'ordres en un script tal com faríeu amb les variables regulars. Modifiquem el nostre script, tal com es mostra a continuació, i desem-lo amb el nom noufcnt2.sh
:
#! / bin / bash folder_to_count = $ 1 file_count = $ (ls $ folder_to_count | wc -l) eco $ file_count fitxers a $ folder_to_count
Aquesta vegada, el carpeta_per_comptar
a la variable se li assigna el valor del primer paràmetre de línia d'ordres, $1
.
La resta del guió funciona exactament com abans. Més que una solució específica, ara el vostre script és general. Podeu utilitzar-lo en qualsevol directori perquè no està codificat per treballar només amb "/ dev".
A continuació s’explica com podeu executar el script:
chmod + x fcnt2.sh
Ara, proveu-ho amb uns quants directoris. Primer podeu fer "/ dev" per assegurar-vos que obteniu el mateix resultat que abans. Escriviu el següent:
./fnct2.sh / dev
./fnct2.sh / etc.
./fnct2.sh / bin
Obteniu el mateix resultat (207 fitxers) que abans al directori "/ dev". Això és encoratjador i obtindreu resultats específics de directori per a cadascun dels altres paràmetres de la línia d’ordres.
Per escurçar l'script, podeu prescindir de la variable,carpeta_per_comptar
, en conjunt, i només referència $1
a tot arreu, de la següent manera:
#! / bin / bash file_count = $ (ls $ 1 wc -l) echo $ file_count files in $ 1
Treballar amb variables especials
Vam esmentar $0
, que sempre s'estableix al nom de fitxer de l'script. Això us permet utilitzar l'script per fer coses com imprimir correctament el seu nom, encara que es canviï el nom. Això és útil en situacions de registre, en què voleu saber el nom del procés que ha afegit una entrada.
A continuació es mostren les altres variables predeterminades especials:
- $#: Quants paràmetres de línia d'ordres s'han passat a l'script.
- $@: Tots els paràmetres de la línia d'ordres passats a l'script.
- $?: L'estat de sortida de l'últim procés que s'ha executat.
- $$: L'identificador de procés (PID) de l'script actual.
- USUARI $: El nom d'usuari de l'usuari que executa l'script.
- $ HOSTNAME: El nom d'amfitrió de l'ordinador que executa l'script.
- $ SEGONS: El nombre de segons durant els quals s'ha executat l'script.
- $ RANDOM: Retorna un número aleatori.
- $ LINENO: Retorna el número de línia actual de l'script.
Voleu veure-les totes en un mateix guió, oi? Tu pots! Deseu el següent com a fitxer de text anomenat,especial.sh
:
#! / bin / bash echo "Hi havia $ # paràmetres de línia d'ordres" echo "Són: $ @" echo "El paràmetre 1 és: $ 1" echo "L'escriptura es diu: $ 0" # qualsevol procés antic perquè puguem informar a l'estat de sortida pwd echo "pwd va retornar $?" echo "Aquest script té l'identificador de procés $$" echo "L'escriptura el va iniciar $ USER" echo "S'està executant a $ HOSTNAME" sleep 3 echo "Ha estat funcionant durant $ SECONDS segons" echo "Número aleatori: $ RANDOM" eco "Aquesta és la línia número $ LINENO de l'script"
Escriviu el següent per fer-lo executable:
chmod + x special.sh
Ara, podeu executar-lo amb un munt de paràmetres de línia d’ordres diferents, com es mostra a continuació.
Variables del mediambient
Bash utilitza variables d'entorn per definir i registrar les propietats de l'entorn que crea quan es llança. Podeu accedir fàcilment a aquesta informació de retenció, com ara el vostre nom d'usuari, la configuració regional, el nombre d'ordres que pot contenir el fitxer d'historial, el vostre editor predeterminat i molt més.
Per veure les variables d'entorn actives a la sessió de Bash, utilitzeu aquesta ordre:
env | menys
Si us desplaceu per la llista, en trobareu alguns que serien útils per fer referència als vostres scripts.
Com exportar variables
Quan s’executa un script, es troba en el seu propi procés i les variables que utilitza no es poden veure fora d’aquest procés. Si voleu compartir una variable amb un altre script que llança el vostre script, heu d'exportar aquesta variable. Us mostrarem com fer-ho amb dos scripts.
En primer lloc, deseu el següent amb el nom del fitxerscript_one.sh
:
#! / bin / bash first_var = alpha second_var = bravo # comprova els seus valors echo "$ 0: first_var = $ first_var, second_var = $ second_var" exporta first_var exporta second_var ./script_two.sh # torna a comprovar els seus valors echo "$ 0: first_var = $ primer_var, segon_var = $ segon_var "
Això crea dues variables, primer_var
i segon_var
, i assigna alguns valors. Imprimeix a la finestra del terminal, exporta les variables i crida script_two.sh
. Quan script_two.sh
finalitza i el flux de procés torna a aquest script, torna a imprimir les variables a la finestra del terminal. A continuació, podeu veure si han canviat.
El segon script que utilitzarem és script_two.sh
. Aquest és el guió quescript_one.sh
trucades. Escriviu el següent:
#! / bin / bash # comprova els seus valors echo "$ 0: first_var = $ first_var, second_var = $ second_var" # set new values first_var = charlie second_var = delta # revisa els seus valors echo "$ 0: first_var = $ first_var, second_var = $ second_var "
Aquest segon script imprimeix els valors de les dues variables, els assigna nous valors i els torna a imprimir.
Per executar aquests scripts, heu d’escriure el següent per fer-los executables:
chmod + x script_one.sh chmod + x script_two.sh
I ara, escriviu el següent per iniciar script_one.sh
:
./script_one.sh
Això és el que ens indica la sortida:
- script_one.sh imprimeix els valors de les variables, que són alfa i bravo.
- script_two.sh imprimeix els valors de les variables (alfa i bravo) tal com les va rebre.
- script_two.sh els canvia a Charlie i Delta.
- script_one.sh imprimeix els valors de les variables, que encara són alfa i bravo.
El que passa al segon guió es manté al segon guió. És com si les còpies de les variables s’enviessin al segon script, però es descarten quan surt aquest script. Les variables originals del primer script no es veuen alterades per res que els passi a les còpies del segon script.
Com es citen les variables
És possible que us hàgiu adonat que, quan els scripts fan referència a variables, estan entre cometes "
. Això permet fer referència correctament a les variables, de manera que els seus valors s'utilitzen quan s'executa la línia a l'script.
Si el valor que assigneu a una variable inclou espais, hauran d'estar entre cometes quan els assigneu a la variable. Això es deu al fet que, per defecte, Bash utilitza un espai com a delimitador.
Aquí teniu un exemple:
site_name = Friki pràctic
Bash veu l'espai abans de "Geek" com una indicació que s'inicia una nova ordre. Informa que no hi ha cap ordre i abandona la línia. ressò
ens mostra que el nom del lloc
la variable no conté res, ni tan sols el text "How-To".
Torneu-ho a provar amb cometes al voltant del valor, com es mostra a continuació:
site_name = "Friki pràctic"
Aquesta vegada, s’ha reconegut com a valor únic i s’assigna correctament a nom del lloc
variable.
eco és el teu amic
Pot trigar un temps a acostumar-se a la substitució d’ordres, a citar variables i a recordar quan s’ha d’incloure el signe del dòlar.
Abans de prémer Retorn i executar una línia d'ordres de Bash, proveu-ho amb ressò
davant seu. D’aquesta manera, podeu assegurar-vos que el que passarà sigui el que vulgueu. També podeu detectar els errors que hagueu comès a la sintaxi.