BashIniziare con Bash


Versioni

Versione Data di rilascio
0.99 1989/06/08
1.01 1989/06/23
2.0 1996/12/31
2.02 1998/04/20
2.03 1999/02/19
2.04 2001/03/21
2.05b 2002/07/17
3.0 2004-08-03
3.1 2005-12-08
3.2 2006-10-11
4.0 2009-02-20
4.1 2009-12-31
4.2 2011-02-13
4.3 2014/02/26
4.4 2016/09/15

Gestione degli argomenti con nome

#!/bin/bash

deploy=false
uglify=false

while (( $# > 1 )); do case $1 in
   --deploy) deploy="$2";;
   --uglify) uglify="$2";;
   *) break;
 esac; shift 2
done

$deploy && echo "will deploy... deploy = $deploy"
$uglify && echo "will uglify... uglify = $uglify"

# how to run
# chmod +x script.sh
# ./script.sh --deploy true --uglify false
 

Ciao mondo

Shell interattiva

La shell Bash viene comunemente utilizzata in modo interattivo: consente di immettere e modificare i comandi, quindi li esegue quando si preme il tasto A capo . Molti sistemi operativi basati su Unix e Unix usano Bash come shell predefinita (in particolare Linux e macOS). Il terminale immette automaticamente un processo di shell Bash interattivo all'avvio.

Output Hello World digitando quanto segue:

echo "Hello World"
#> Hello World  # Output Example
 

Gli appunti

  • Puoi cambiare la shell semplicemente digitando il nome della shell nel terminale. Ad esempio: sh , bash , ecc.

  • echo è un comando builtin di Bash che scrive gli argomenti che riceve sullo standard output. Aggiunge una nuova riga all'output, per impostazione predefinita.


Shell non interattiva

La shell Bash può anche essere eseguita in modo non interattivo da uno script, rendendo la shell non richiede interazione umana. Il comportamento interattivo e il comportamento basato su script dovrebbero essere identici, un aspetto importante della progettazione della shell Bourne di Unix V7 e di Bash transitivamente. Pertanto tutto ciò che può essere fatto sulla linea di comando può essere inserito in un file di script per il riutilizzo.

Segui questi passaggi per creare uno script Hello World :

  1. Crea un nuovo file chiamato hello-world.sh

    touch hello-world.sh
     
  2. Rendi eseguibile lo script eseguendo chmod +x hello-world.sh

  3. Aggiungi questo codice:

    #!/bin/bash
    echo "Hello World"
     

    Linea 1 : la prima riga dello script deve iniziare con la sequenza di caratteri #! , indicato come Shebang 1 . Lo shebang indica al sistema operativo di eseguire /bin/bash , la shell Bash, passandogli il percorso dello script come argomento.

    Ad esempio /bin/bash hello-world.sh

    Linea 2 : utilizza il comando echo per scrivere Hello World sullo standard output.

  1. Esegui lo script hello-world.sh dalla riga di comando usando uno dei seguenti:

    • ./hello-world.sh - più comunemente usato e raccomandato
    • /bin/bash hello-world.sh
    • bash hello-world.sh - assumendo /bin è nel tuo $PATH
    • sh hello-world.sh

Per l'uso di produzione reale, si omettere l'estensione .sh (che è comunque fuorviante, poiché si tratta di uno script Bash, non di uno script sh ) e forse spostare il file in una directory all'interno del PATH modo che sia disponibile a prescindere da la tua attuale directory di lavoro, proprio come un comando di sistema come cat o ls .

Gli errori più comuni includono:

  1. Dimenticando di applicare il permesso di esecuzione sul file, cioè chmod +x hello-world.sh , risultante nell'output di ./hello-world.sh: Permission denied .

  2. Modifica dello script su Windows, che produce caratteri di fine riga errati che Bash non può gestire.

    Un sintomo comune è : command not found dove il ritorno a capo ha forzato il cursore all'inizio della riga, sovrascrivendo il testo prima dei due punti nel messaggio di errore.

    Lo script può essere corretto usando il programma dos2unix .

    Un esempio di utilizzo: dos2unix hello-world.sh

    dos2unix modifica il file in linea.

  3. Usando sh ./hello-world.sh , non ci sh ./hello-world.sh conto che bash e sh sono gusci distinti con caratteristiche distinte (anche se poiché Bash è retrocompatibile, l'errore opposto è innocuo).

    Ad ogni modo, basandosi semplicemente sulla linea shebang dello script è decisamente preferibile scrivere in modo esplicito bash o sh (o python o perl o awk o ruby o ...) prima del nome di ogni script.

    Una linea di shebang comune da usare per rendere il tuo script più portabile è usare #!/usr/bin/env bash invece di codificare un percorso per Bash. In questo modo, /usr/bin/env deve esistere, ma oltre quel punto bash deve solo essere sul tuo PATH . Su molti sistemi, /bin/bash non esiste, e dovresti usare /usr/local/bin/bash o qualche altro percorso assoluto; questo cambiamento evita di dover capire i dettagli di questo.


1 Chiamato anche sha-bang, hashbang, pound-bang, hash-pling.

Ciao mondo in modalità "Debug"

$ cat hello.sh 
#!/bin/bash 
echo "Hello World"
$ bash -x hello.sh 
+ echo Hello World
Hello World
 

L'argomento -x ti consente di scorrere ogni riga dello script. Un buon esempio è qui:

$ cat hello.sh
#!/bin/bash 
echo "Hello World\n" 
adding_string_to_number="s"
v=$(expr 5 + $adding_string_to_number) 

$ ./hello.sh 
Hello World

expr: non-integer argument
 

L'errore richiesto sopra non è sufficiente per tracciare lo script; tuttavia, l'uso del seguente metodo ti dà un senso migliore in cui cercare l'errore nello script.

$ bash -x hello.sh 
+ echo Hello World\n
Hello World

+ adding_string_to_number=s
+ expr 5 + s
expr: non-integer argument
+ v=
 

Ciao mondo usando variabili

Crea un nuovo file chiamato hello.sh con il seguente contenuto e forniscilo autorizzazioni eseguibili con chmod +x hello.sh .

Esegui / Esegui tramite: ./hello.sh

#!/usr/bin/env bash

# Note that spaces cannot be used around the `=` assignment operator
whom_variable="World"

# Use printf to safely output the data
printf "Hello, %s\n" "$whom_variable"
#> Hello, World
 

Questo stamperà Hello, World sullo standard output quando viene eseguito.

Per capire dov'è lo script, devi essere molto specifico, puntandolo alla directory contenente, normalmente con ./ se è la tua directory di lavoro, dove . è un alias della directory corrente. Se non si specifica la directory, bash tenta di individuare lo script in una delle directory contenute nella variabile di ambiente $PATH .


Il seguente codice accetta un argomento $1 , che è il primo argomento della riga di comando, e lo restituisce in una stringa formattata, seguendo Hello,

Esegui / Esegui tramite: ./hello.sh World

#!/usr/bin/env bash
printf "Hello, %s\n" "$1"
#> Hello, World
 

È importante notare che $1 deve essere quotato in virgolette doppie, non in virgolette singole. "$1" espande al primo argomento della riga di comando, come desiderato, mentre '$1' valuta la stringa letterale $1 .

Nota di sicurezza:
Leggi le implicazioni sulla sicurezza di dimenticare di citare una variabile in shell bash per capire l'importanza di inserire il testo variabile tra virgolette.

Ciao mondo con l'input dell'utente

Quanto segue richiederà all'utente un input e quindi memorizzerà quell'input come una stringa (testo) in una variabile. La variabile viene quindi utilizzata per fornire un messaggio all'utente.

#!/usr/bin/env bash
echo  "Who are you?"
read name
echo "Hello, $name."
 

Il comando qui read legge una riga di dati dall'input standard nel name della variabile. Questo viene quindi referenziato usando $name e stampato allo standard usando echo .

Esempio di output:

$ ./hello_world.sh
Who are you?
Matt
Hello, Matt.
 

Qui l'utente ha inserito il nome "Matt" e questo codice è stato usato per dire Hello, Matt. .

E se vuoi aggiungere qualcosa al valore della variabile mentre lo stampi, usa parentesi graffe attorno al nome della variabile come mostrato nel seguente esempio:

#!/usr/bin/env bash
echo  "What are you doing?"
read action
echo "You are ${action}ing."
 

Esempio di output:

$ ./hello_world.sh
What are you doing?
Sleep
You are Sleeping.
 

Qui quando l'utente inserisce un'azione, "ing" viene aggiunto a quell'azione durante la stampa.

Importanza della citazione nelle stringhe

La quotazione è importante per l'espansione delle stringhe in bash. Con questi, puoi controllare come la bash analizza e espande le tue stringhe.

Esistono due tipi di quotazione:

  • Debole : usa le doppie virgolette: "
  • Forte : usa le virgolette singole: '

Se vuoi bash per espandere il tuo argomento, puoi usare Debole Citazioni :

#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World
 

Se non vuoi bash per espandere il tuo argomento, puoi usare Strong Quoting :

#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world
 

Puoi anche usare la fuga per impedire l'espansione:

#!/usr/bin/env bash
world="World"
echo "Hello \$world"
#> Hello $world
 

Per informazioni più dettagliate oltre ai dettagli per principianti, puoi continuare a leggerlo qui .

Visualizzazione delle informazioni per i built-in di Bash

help <command>
 

Questo mostrerà la pagina di aiuto di Bash (manuale) per il built-in specificato.

Ad esempio, l' help unset mostrerà:

unset: unset [-f] [-v] [-n] [name ...]
   Unset values and attributes of shell variables and functions.

   For each NAME, remove the corresponding variable or function.

   Options:
     -f    treat each NAME as a shell function
     -v    treat each NAME as a shell variable
     -n    treat each NAME as a name reference and unset the variable itself
       rather than the variable it references

   Without options, unset first tries to unset a variable, and if that fails,
   tries to unset a function.

   Some variables cannot be unset; also see `readonly'.

   Exit Status:
   Returns success unless an invalid option is given or a NAME is read-only.
 

Per vedere un elenco di tutti i built-in con una breve descrizione, utilizzare

help -d