Com crear scripts de Shell simples a Linux


Crear scripts d'intèrpret d'ordres és una de les habilitats més essencials que els usuaris de Linux haurien de tenir a la punta dels dits. Els scripts d'intèrpret d'ordres tenen un paper enorme en l'automatització de tasques repetitives que, d'altra manera, serien tediosos executar línia per línia.

En aquest tutorial, destaquem algunes de les operacions bàsiques de script d'intèrpret d'ordres que hauria de tenir tot usuari de Linux.

1. Creeu un script de Shell simple

Un script d'intèrpret d'ordres és un fitxer que inclou text ASCII. Començarem per crear un script d'intèrpret d'ordres senzill i, per fer-ho, utilitzarem un editor de text. Hi ha un bon nombre d'editors vim.

Començarem creant un script senzill que mostra \Hola món quan s'executa.

$ vim hello.sh

Enganxeu el contingut següent al fitxer i deseu-lo.

#!/bin/bash
# Print Hello world message
echo "Hello World!"

Anem a repassar l'script de shell línia per línia.

  • La primera línia, #!/bin/bash, es coneix com a capçalera shebang. Aquesta és una construcció especial que indica quin programa s'utilitzarà per interpretar l'script. En aquest cas, aquest serà el shell bash indicat per /bin/bash. Hi ha altres llenguatges d'escriptura com Python, que s'indica amb #!/usr/bin/python3 i Perl la capçalera shebang del qual es denota amb #!/usr/bin/perl>.
  • La segona línia és un comentari. Un comentari és una declaració que descriu què fa un script de shell i què no s'executa quan s'executa l'script. Els comentaris sempre van precedits pel signe hash #.
  • L'última línia és l'ordre que imprimeix el missatge Hola món al terminal.

El següent pas és fer que l'script sigui executable assignant permís d'execució mitjançant l'ordre chmod tal com es mostra.

$ chmod +x  hello.sh

Finalment, executeu l'script de shell utilitzant qualsevol de les ordres:

$ bash hello.sh
OR
$ ./hello.sh

2. Ús d'instruccions condicionals per executar codi

Com altres llenguatges de programació, les declaracions condicionals s'utilitzen en els scripts bash per prendre decisions, amb només una lleugera variació en la sintaxi. Cobrirem les declaracions condicionals if, if-else i elif.

La instrucció if es pot utilitzar per provar condicions individuals o múltiples. Començarem amb l'ús fonamental de la declaració if per provar una sola condició. La sentència if està definida pels blocs if... fi.

if command
then
  statement
fi

Fem una ullada a l'script de l'intèrpret d'ordres a continuació.

#!/bin/bash
echo 'Enter the score'
read x

if [[ $x == 70 ]]; then
  echo 'Good job!'
fi

L'script de l'intèrpret d'ordres anterior demana a l'usuari que proporcioni una puntuació que després s'emmagatzema en una variable x. Si la puntuació correspon a 70, l'script retorna la sortida \Bon treball!. L'operador de comparació == s'utilitza per comprovar si la puntuació introduïda, que s'emmagatzema a la variable x, és equivalent. a 100.

Altres operadors de comparació que podeu utilitzar inclouen:

  • -eq: igual a
  • -ne: no és igual a
  • -lt: menys que
  • -le: menor o igual a
  • -lt: menys que
  • -ge: més gran o igual que

Per exemple, el bloc de la instrucció if de sota imprimeix Treballeu més si la puntuació d'entrada és qualsevol valor inferior a 50.

if [[ $x -lt 50 ]]; then
  echo 'Work Harder!'
fi

Per a situacions en què teniu dos possibles resultats: – si això o allò – la declaració if-else és útil.

if command
then
  statement1
else
  statement2
fi

L'script següent llegeix la puntuació d'entrada i comprova si és superior o igual a 70.

Si la puntuació és superior o igual a 70, rebràs el missatge Bon treball, has superat!. Tanmateix, si la puntuació baixa per sota de 70, s'imprimirà la sortida Has fallat.

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -ge 70 ]]; then
  echo 'Great job, You passed!'
else
  echo  'You failed'
fi

En escenaris on hi ha múltiples condicions i resultats diferents, s'utilitza la declaració if-elif-else. Aquesta declaració té el format següent.

if condition1
then
  statement1
elif condition2
then
  statement2
else
  statement3
fi

Per exemple, tenim un guió per a una loteria que verifica si el número introduït és 90, 60 o 30.

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -eq 90 ]];
then
  echo “You have won the First Prize”

elif [[ $x -eq 60 ]];
then
  echo “You have won the Second Prize”

elif [[ $x -eq 30 ]];
then 
  echo “You have won the Second Prize”
else
  echo “Please try again”
fi

3. Ús de la instrucció If amb la lògica AND

Podeu utilitzar la instrucció if juntament amb l'operador lògic AND per executar una tasca si es compleixen dues condicions. L'operador && s'utilitza per indicar la lògica AND.

#!/bin/bash

echo 'Please Enter your user_id'
read user_id

echo 'Please Enter your tag_no'
read tag_id

if [[ ($user_id == “tecmint” && $tag_id -eq 3990) ]];
then
  echo “Login successful”
else
  echo “Login failure”
fi

5. Ús de la instrucció If amb la lògica OR

Quan s'utilitza la lògica OR, que es representa amb el símbol ||, s'ha de complir qualsevol de les condicions amb l'script per donar els resultats esperats.

#!/bin/bash

echo 'Please enter a random number'
read number

if [[ (number -eq 55 || number -eq 80) ]];
then
 echo 'Congratulations! You’ve won'
else
 echo 'Sorry, try again'
fi

Utilitzeu construccions en bucle

Els bucles Bash permeten als usuaris realitzar una sèrie de tasques fins que s'aconsegueix un determinat resultat. Això és útil per realitzar tasques repetitives. En aquesta secció, donarem un cop d'ull a alguns dels bucles que també trobareu en altres llenguatges de programació.

Aquest és un dels bucles més fàcils de treballar. La sintaxi és bastant senzilla:

while  <some test>
do
 commands
done

El bucle while a continuació enumera tots els números de l'1 al 10 quan s'executa.

#!/bin/bash
# A simple while loop
counter=1
while [ $counter -le 10 ]
 do
echo $counter
 ((counter++))
done

Parlem del bucle while:

El comptador de variables s'inicialitza a 1. I mentre que la variable és menor o igual a 10, el valor del comptador s'incrementarà fins que es compleixi la condició. La línia echo $counter imprimeix tots els números de l'1 al 10.

Igual que el bucle while, s'utilitza un bucle for per executar codi iterativament. és a dir repetir l'execució de codi tantes vegades com sigui possible definit per l'usuari.

La sintaxi és:

for var in 1 2 3 4 5 N
do
 command1
 command2
done

El bucle for següent itera de l'1 fins al 10 i processa els seus valors a la pantalla.

Una millor manera d'aconseguir-ho és definir un rang utilitzant les claus dobles { } com es mostra en lloc d'escriure tots els números.

#!/bin/bash
# Specify range in a for loop

for num in {1..10}
do
  echo $num
done

Paràmetres posicionals de Bash

Un paràmetre posicional és una variable especial a la qual es fa referència a l'script quan es passen valors a l'intèrpret d'ordres però no es poden assignar. Els paràmetres de posició van des de $0 $1 $2 $3 ...... fins a $9. Més enllà del valor de 9 $, els paràmetres s'han de tancar entre claudàtors, per exemple, $ {10}, $ {11}... i així successivament.

Quan s'executa l'script, el primer paràmetre posicional que és $0 pren el nom de l'script de l'intèrpret d'ordres. El paràmetre $1 pren la primera variable que es passa al terminal, $2 pren la segona, $3 la tercera i així successivament.

Creem un script test.sh tal com es mostra.

#!/bin/bash
echo "The name of the script is: " $0
echo "My first name is: " $1
echo "My second name is: " $2

A continuació, executeu l'script i proporcioneu el primer i el segon nom com a arguments:

# bash test.sh James Kiarie

A la sortida, podem veure que la primera variable que s'imprimeix és el nom de l'script shell, en aquest cas, test.sh. A continuació, els noms s'imprimeixen corresponents als paràmetres posicionals definits a l'script de l'intèrpret d'ordres.

Els paràmetres posicionals són útils perquè us ajuden a personalitzar les dades que s'introdueixen en lloc d'assignar explícitament un valor a una variable.

Codis de sortida de comandaments de Shell

Comencem responent a una pregunta senzilla: Què és un codi de sortida?

Cada comanda executada a l'intèrpret d'ordres per un usuari o un script d'intèrpret d'ordres té un estat de sortida. Un estat de sortida és un nombre enter.

Un estat de sortida de 0 implica que l'ordre s'ha executat correctament sense cap error. Qualsevol cosa entre 1 i 255 mostra que l'ordre ha fallat o no s'ha executat correctament.

Per trobar l'estat de sortida d'una ordre, utilitzeu la variable Shell $?.

Un estat de sortida d'1 indica un error general o qualsevol error inadmissible, com ara l'edició de fitxers sense permisos sudo.

Un estat de sortida de 2 punts a l'ús incorrecte d'una ordre o d'una variable d'intèrpret d'ordres integrada.

L'estat de sortida 127 apunta a una ordre il·legal que normalment produeix l'error ordre no trobada.

Processament de la sortida d'ordres de Shell dins d'un script

En els scripts de bash, podeu emmagatzemar la sortida d'una ordre en una variable per a un ús futur. Això també es coneix com a substitució d'ordres de shell i es pot aconseguir de les maneres següents.

variable=$(command)
OR
variable=$(/path/to/command)
OR
variable=$(command argument 1 argument 2 ...)

Per exemple, podeu emmagatzemar l'ordre de data en una variable anomenada avui i cridar l'script de l'intèrpret d'ordres per revelar la data actual.

#!/bin/bash

today=$(date)

echo “Today is $today”

Prenguem un altre exemple. Suposem que voleu trobar els usuaris d'inici de sessió vàlids al vostre sistema Linux. Com ho faries? En primer lloc, la llista de tots els usuaris (tant del sistema, del procés i dels usuaris d'inici de sessió) s'emmagatzema al fitxer /etc/passwd.

Per veure el fitxer, haureu d'utilitzar l'ordre grep per cercar usuaris amb l'atribut /bin/bash i utilitzar l'ordre cut -c 1-10 tal com es mostra per mostrar els 10 primers caràcters dels noms.

Hem emmagatzemat l'ordre cat a la variable login_users.

#!/bin/bash
login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10)
echo 'This is the list of login users:
echo $login_users

Això porta al final del nostre tutorial sobre com crear scripts d'intèrpret d'ordres simples. Esperem que ho trobeu valuós.