In questo tutorial parleremo degli script di shell e di come creare il tuo primo script di shell. Sono chiamati script di shell in generale, ma li chiameremo script Bash perché useremo Bash tra le altre shell di Linux.
Ci sono zsh, tcsh, ksh e altre shell.
Nei post precedenti, abbiamo visto come usare la shell Bash e come usare i comandi Linux.
Il concetto di uno script Bash è eseguire una serie di comandi per portare a termine il tuo lavoro.
Per eseguire più comandi in un unico passaggio dalla shell, puoi digitarli su una riga e separarli con punto e virgola.
pwd ; whoami
Questo è uno script Bash!!
Viene prima eseguito il comando pwd, che mostra la directory di lavoro corrente, quindi viene eseguito il comando whoami per mostrare gli utenti attualmente connessi.
Puoi eseguire più comandi quanto vuoi, ma con un limite. Puoi determinare i tuoi argomenti massimi usando questo comando.
getconf ARG_MAX
Bene, che ne dici di inserire i comandi in un file, e quando abbiamo bisogno di eseguire questi comandi, eseguiamo solo quel file. Questo è chiamato script Bash.
Innanzitutto, crea un nuovo file usando il comando touch. All'inizio di qualsiasi script Bash, dovremmo definire quale shell useremo perché ci sono molte shell su Linux, la shell Bash è una di queste.
Shebang script di shell
La prima riga che digiti quando scrivi uno script Bash è la (#!) seguita dalla shell che utilizzerai.
#! <===questo segno si chiama shebang.
#!/bin/bash
Se usi il cancelletto (#) davanti a qualsiasi riga nello script della shell, questa riga diventerà un commento, il che significa che non verrà elaborata, ma la riga sopra è un caso speciale. Questa riga definisce quale shell useremo, che è la shell Bash nel nostro caso.
I comandi della shell vengono inseriti uno per riga in questo modo:
#!/bin/bash # This is a comment pwd whoami
Puoi digitare più comandi sulla stessa riga, ma devi separarli con punto e virgola, ma è preferibile scrivere comandi su righe separate; questo semplificherà la lettura in seguito.
Imposta l'autorizzazione allo script
Dopo aver scritto lo script della shell, salva il file.
Ora, imposta quel file in modo che sia eseguibile; in caso contrario, ti darà il permesso negato. Puoi rivedere come impostare i permessi usando il comando chmod.
chmod +x ./myscript
Quindi prova a eseguirlo semplicemente digitandolo nella shell:
./myscript
E sì, viene eseguito.
Crea il tuo primo script Bash
Come sappiamo da altri post, la stampa del testo non viene eseguita utilizzando il
echo
comando.
Modifica il tuo file e digita questo:
#!/bin/bash # our comment is here echo "The current directory is:" pwd echo "The user logged in is:" whoami
Guarda l'output:
Perfetto! Ora possiamo eseguire comandi e visualizzare il testo:
echo
Se non conosci il comando echo o come modificare un file, ti consiglio di leggere gli articoli precedenti sui comandi di base di Linux.
Utilizzo delle variabili
Le variabili ti consentono di memorizzare informazioni per utilizzarle nel tuo script.
Puoi definire due tipi di variabili nello script della shell:
- Variabili d'ambiente
- Variabili utente
Variabili d'ambiente
A volte è necessario interagire con le variabili di sistema; puoi farlo usando le variabili di ambiente.
#!/bin/bash # display user home echo "Home for the current user is: $HOME"
Si noti che mettiamo la variabile di sistema $HOME tra virgolette doppie e stampa correttamente la variabile home.
E se volessimo stampare il simbolo del dollaro stesso?
echo "I have $1 in my pocket"
Poiché la variabile $ 1 non esiste, non funzionerà. Allora come superarlo?
Puoi usare il carattere di escape, che è la barra rovesciata \ prima del simbolo del dollaro in questo modo:
echo "I have \$1 in my pocket"
Adesso funziona!!
Variabili utente
Inoltre, puoi impostare e utilizzare le tue variabili personalizzate nello script.
Puoi chiamare le variabili utente allo stesso modo di questo:
#!/bin/bash # User variables grade=5 person="Adam" echo "$person is a good boy, he is in grade $grade"
chmod +x myscript ./myscript
Sostituzione dei comandi
Puoi estrarre informazioni dal risultato di un comando usando la sostituzione del comando.
Puoi eseguire la sostituzione dei comandi con uno dei seguenti metodi:
- Il carattere di apice inverso (`).
- Il formato $().
Assicurati che quando digiti il carattere di apice inverso, non sia la virgoletta singola.
Devi racchiudere il comando con due backtick come questo:
mydir=`pwd`
O nell'altro modo:
mydir=$(pwd)
Quindi lo script potrebbe essere così:
#!/bin/bash mydir=$(pwd) echo $mydir
Puoi memorizzare l'output del comando nella variabile mydir.
Calcolo matematico
Puoi eseguire calcoli matematici di base utilizzando il formato $(( 2 + 2 )):
#!/bin/bash var1=$(( 5 + 5 )) echo $var1 var2=$(( $var1 * 2 )) echo $var2
Proprio così facile.
istruzione if-then
I tuoi script di shell avranno bisogno di istruzioni condizionali. Come se il valore è inferiore a 10, fallo altrimenti fallo. Puoi immaginare qualsiasi logica tu voglia.
La struttura più elementare dell'istruzione if-then è questa:
se comando; poi
fai qualcosa
fi
ed ecco un esempio:
#!/bin/bash if whoami; then echo "It works" fi
Dal
whoami
restituirà il mio utente in modo che la condizione restituirà true e stamperà il messaggio.
Scaviamo più a fondo e usiamo altri comandi che conosciamo.
Verifica se esiste un utente
Forse cercando un utente specifico nel file dell'utente
/etc/passwd
e se esiste un record, dimmelo in un messaggio.
#!/bin/bash user=likegeeks if grep $user /etc/passwd; then echo "No such a user $user" fi
Usiamo il
/etc/passwd
file. Puoi controllare il nostro tutorial sul comando grep.
Se l'utente esiste, lo script della shell stamperà il messaggio.
E se l'utente non esiste? Lo script uscirà dall'esecuzione senza dirci che l'utente non esiste. OK, miglioriamo ulteriormente lo script.
istruzione if-then-else
L'istruzione if-then-else assume la seguente struttura:
se comando; poi
fai qualcosa
altro
fai un'altra cosa
fi
Se il primo comando viene eseguito e restituisce zero, il che significa successo, non eseguirà i comandi dopo l'istruzione else; in caso contrario, se l'istruzione if restituisce un valore diverso da zero; il che significa che la condizione dell'istruzione fallisce, in questo caso, la shell eseguirà i comandi dopo l'istruzione else.
#!/bin/bash user=anotherUser if grep $user /etc/passwd; then echo "The user $user Exists" else echo "The user $user doesn’t exist" fi
Finora stiamo andando bene, continua a muoverti.
E se avessimo bisogno di altre affermazioni.
Bene, è facile, possiamo ottenerlo nidificando if affermazioni come questa:
se condizione1; poi
comandi
condizione elif2; poi
comandi
fi
Se il primo comando restituisce zero; significa successo, eseguirà i comandi dopo di esso, altrimenti se il secondo comando restituisce zero, eseguirà i comandi dopo di esso, altrimenti se nessuno di questi restituisce zero, eseguirà solo gli ultimi comandi.
#!/bin/bash user=anotherUser if grep $user /etc/passwd; then echo "The user $user Exists" elif ls /home; then echo "The user doesn’t exist" fi
Puoi immaginare qualsiasi scenario, magari se l'utente non esiste, crea un utente usando il
useradd
comandare o fare qualsiasi altra cosa.
Combina i test
Puoi combinare più test usando il comando AND (&&) o OR (||).
#!/bin/bash dir=/home/likegeeks name="likegeeks" if [ -d $dir ] && [ -n $name ]; then echo "The name exists and the folder $dir exists." else echo "One test failed" fi
Questo esempio restituirà true solo se entrambi i test hanno avuto esito positivo; in caso contrario, fallirà.
Inoltre, puoi usare OR (||) allo stesso modo:
#!/bin/bash dir=/home/likegeeks name="likegeeks" if [ -d $dir ] || [ -n $name ]; then echo "Success!" else echo "Both tests failed" fi
Questo esempio restituirebbe il successo se uno o entrambi hanno avuto successo.
Fallirebbe solo se fallissero entrambi.
Confronti numerici
Puoi eseguire un confronto numerico tra due valori numerici utilizzando controlli di confronto numerico come questo:
numero1 -eq numero2 Verifica se numero1 è uguale a numero2.
numero1 -ge numero2 Controlla se numero1 è maggiore o uguale a numero2.
numero1 -gt numero2 Verifica se numero1 è maggiore di numero2.
numero1 -le numero2 Controlla se numero1 è minore o uguale a numero2.
number1 -lt number2 Verifica se numero1 è minore di numero2.
numero1 -ne numero2 Verifica se numero1 non è uguale a numero2.
Ad esempio, ne proveremo uno e il resto è lo stesso.
Nota che la dichiarazione di confronto è tra parentesi quadre come mostrato.
#!/bin/bash num=11 if [ $num -gt 10]; then echo "$num is bigger than 10" else echo "$num is less than 10" fi
Il num è maggiore di dieci, quindi eseguirà la prima istruzione e stamperà la prima eco.
Confronti di stringhe
Puoi confrontare le stringhe in uno dei seguenti modi:
stringa1 =stringa2 Verifica se stringa1 è identica a stringa2.
stringa1 !=stringa2 Verifica se stringa1 non è identica a stringa2.
stringa1
stringa1> stringa2 Verifica se stringa1 è maggiore di stringa2.
-n stringa1 Controlla se stringa1 è più lunga di zero.
-z stringa1 Verifica se stringa1 è di lunghezza zero.
Possiamo applicare un confronto di stringhe al nostro esempio:
Una nota delicata sul maggiore e minore di per i confronti di stringhe, DEVONO essere escape con la barra rovesciata perché se usi solo il simbolo maggiore di, mostra risultati errati.
Quindi dovresti farlo così:
Funziona, ma dà questo avviso:
Per risolverlo, avvolgi $vals con una doppia virgoletta, costringendolo a rimanere come una stringa come questa:
Una nota critica su maggiore e minore di per confronti di stringhe. Controlla il seguente esempio per capire la differenza:
come geek
Mi piace
La condizione di test considera le lettere minuscole più grandi delle lettere maiuscole.
A differenza del comando di ordinamento, che fa l'opposto.
La condizione di test si basa sull'ordine ASCII.
Mentre il comando di ordinamento si basa sugli ordini di numerazione dalle impostazioni di sistema.
Puoi confrontare e controllare i file utilizzando i seguenti operatori:
-d mio_file Controlla se è una cartella.
-e mio_file Verifica se il file è disponibile.
-f mio_file Controlla se è un file.
-r mio_file Verifica se è leggibile.
mio_file – nt my_file2 Verifica se my_file è più recente di mio_file2.
mio_file – ot my_file2 Verifica se my_file è più vecchio di mio_file2.
-O mio_file Verifica se il proprietario del file e l'utente registrato corrispondono.
-G mio_file Verifica se il file e l'utente registrato hanno un gruppo identico.
Come suggeriscono, non li dimenticherai mai.
Prendiamone uno e prendiamolo come esempio:
Non li digiteremo tutti come esempio. Basta digitare il confronto tra parentesi quadre così com'è e completare normalmente lo script.
Ci sono alcune altre funzionalità avanzate if-then, ma facciamolo in un altro post.
Questo è per ora. Spero che ti piaccia e che continui a esercitarti sempre di più.
Grazie.#!/bin/bash
user="likegeeks"
if [ $user = $USER ]; then
echo "The user $user is the current logged in user"
fi
#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
./myscript: line 5: [: too many arguments
#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
#!/bin/bash
v1=Likegeeks
v2=likegeeks
if [ $v1 \> $v2 ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
sort myfile
sort
sort
Confronti di file
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]; then
echo "Directory $mydir exists"
cd $mydir
ls
else
echo "NO such file or directory $mydir"
fi