Bash Samouczek
Rozpoczęcie pracy z Bash
Szukaj…
Wersje
Wersja | Data wydania |
---|---|
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 | 31.12.2009 |
4.2 | 13.02.2011 |
4.3 | 26.02.2014 |
4.4 | 15.09.2016 |
Witaj świecie, używając zmiennych
Utwórz nowy plik o nazwie hello.sh
o następującej treści i nadaj mu uprawnienia do wykonywania za pomocą chmod +x hello.sh
.
Wykonaj / Uruchom przez:
./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
Spowoduje to wydrukowanie Hello, World
na standardowe wyjście po uruchomieniu.
Aby powiedzieć bashowi, gdzie jest skrypt, musisz być bardzo konkretny, wskazując go na katalog zawierający, zwykle z ./
jeśli jest to katalog roboczy, gdzie .
to alias do bieżącego katalogu. Jeśli nie określisz katalogu, bash
spróbuje zlokalizować skrypt w jednym z katalogów zawartych w zmiennej środowiskowej $PATH
.
Poniższy kod akceptuje argument $1
, który jest pierwszym argumentem wiersza poleceń, i wysyła go w sformatowanym ciągu, po Hello,
Wykonaj / Uruchom przez:
./hello.sh World
#!/usr/bin/env bash
printf "Hello, %s\n" "$1"
#> Hello, World
Ważne jest, aby pamiętać, że $1
musi być cytowany w podwójnym cudzysłowie, a nie w jednym cudzysłowie. "$1"
rozwija się do pierwszego argumentu wiersza poleceń, zależnie od potrzeb, podczas gdy '$1'
ma wartość dosłownym ciąg $1
.
Uwaga bezpieczeństwa:
Przeczytaj Implikacje bezpieczeństwa związane z zapomnieniem cytowania zmiennej w powłokach bash, aby zrozumieć znaczenie umieszczania tekstu zmiennej w podwójnych cudzysłowach.
Witaj świecie
Interactive Shell
Powłoka Bash jest powszechnie używana interaktywnie: pozwala wprowadzać i edytować polecenia, a następnie uruchamia je po naciśnięciu klawisza Return . Wiele systemów operacyjnych opartych na Uniksie i podobnych do niego używa Bash jako domyślnej powłoki (zwłaszcza Linux i macOS). Terminal automatycznie uruchamia interaktywny proces powłoki Bash podczas uruchamiania.
Wyjdź z Hello World
, wpisując następujące polecenie:
echo "Hello World"
#> Hello World # Output Example
Notatki
Możesz zmienić powłokę, wpisując nazwę powłoki w terminalu. Na przykład:
sh
,bash
itp.echo
to wbudowane polecenie Bash, które zapisuje otrzymane argumenty na standardowym wyjściu. Domyślnie dodaje nowy wiersz do wyniku.
Nieinteraktywna powłoka
Powłokę Bash można również uruchamiać ze skryptu w sposób nieinteraktywny , dzięki czemu powłoka nie wymaga interakcji człowieka. Zachowanie interaktywne i zachowanie skryptowe powinny być identyczne - ważne rozważanie projektowe powłoki Unix V7 Bourne i przejściowo Bash. Dlatego wszystko, co można zrobić w wierszu poleceń, można umieścić w pliku skryptu w celu ponownego użycia.
Wykonaj następujące kroki, aby utworzyć skrypt Hello World
:
Utwórz nowy plik o nazwie
hello-world.sh
touch hello-world.sh
Ustaw skrypt jako wykonywalny, uruchamiając
chmod
+x hello-world.sh
Dodaj ten kod:
#!/bin/bash echo "Hello World"
Wiersz 1 : pierwszy wiersz skryptu musi zaczynać się od sekwencji znaków
#!
, określane jako shebang 1 . Shebang instruuje system operacyjny, aby uruchomił/bin/bash
, powłokę Bash, przekazując mu ścieżkę skryptu jako argument.Np.
/bin/bash hello-world.sh
Wiersz 2 : używa polecenia
echo
do napisaniaHello World
na standardowym wyjściu.
Uruchom skrypt
hello-world.sh
z wiersza polecenia, używając jednej z następujących czynności:-
./hello-world.sh
- najczęściej używane i zalecane -
/bin/bash hello-world.sh
-
bash hello-world.sh
- zakładając, że/bin
jest w twojej$PATH
-
sh hello-world.sh
-
Do rzeczywistego użytku produkcyjnego .sh
rozszerzenie .sh
(które i tak wprowadza w błąd, ponieważ jest to skrypt Bash, a nie skrypt sh
) i być może przenosisz plik do katalogu w PATH
, aby był dostępny dla Ciebie niezależnie od bieżący katalog roboczy, podobnie jak polecenie systemowe, takie jak cat
lub ls
.
Typowe błędy to:
Zapomnienie zastosowania uprawnień do wykonania pliku, tj.
chmod +x hello-world.sh
, w wyniku czego powstaje./hello-world.sh: Permission denied
.Edycja skryptu w systemie Windows, który wytwarza niepoprawne znaki kończące linię, których Bash nie może obsłużyć.
Typowym objawem jest
: command not found
którym powrót karetki zmusił kursor do początku wiersza, zastępując tekst przed dwukropkiem w komunikacie o błędzie.Skrypt można naprawić za pomocą programu
dos2unix
.Przykład użycia:
dos2unix hello-world.sh
dos2unix
edytuje plik bezpośrednio.Używając
sh ./hello-world.sh
, nie zdając sobie sprawy, żebash
ish
są odrębnymi powłokami o różnych cechach (chociaż skoro Bash jest kompatybilny wstecz, błąd przeciwny jest nieszkodliwy).W każdym razie po prostu poleganie na linii shebang skryptu jest zdecydowanie lepsze niż jawne pisanie
bash
lubsh
(lubpython
lubperl
awk
lubruby
lub ...) przed nazwą pliku każdego skryptu.Popularną linią shebang, aby uczynić skrypt bardziej przenośnym, jest użycie
#!/usr/bin/env bash
zamiast twardego kodowania ścieżki do Bash. W ten sposób/usr/bin/env
musi istnieć, ale poza tym punktembash
musi znajdować się naPATH
. W wielu systemach/bin/bash
nie istnieje i powinieneś użyć/usr/local/bin/bash
lub innej bezwzględnej ścieżki; ta zmiana pozwala uniknąć szczegółów tego.
1 Nazywany również sha-bang, hashbang, funt-bang, hash-pling.
Wyświetlanie informacji o wbudowanych aplikacjach Bash
help <command>
Spowoduje to wyświetlenie strony pomocy Bash (ręcznej) dla określonego wbudowanego.
Na przykład help unset
pokaże:
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.
Aby wyświetlić listę wszystkich wbudowanych funkcji z krótkim opisem, użyj
help -d
Witaj świecie z danymi wejściowymi użytkownika
Poniższe monituje użytkownika o wprowadzenie danych, a następnie zapisuje je jako ciąg (tekst) w zmiennej. Zmienna jest następnie używana do przekazania użytkownikowi wiadomości.
#!/usr/bin/env bash
echo "Who are you?"
read name
echo "Hello, $name."
Polecenie read
tutaj odczytuje jeden wiersz danych ze standardowego wejścia do name
zmiennej. Jest to następnie określane za pomocą $name
i drukowane na standardowe wyjście za pomocą echo
.
Przykładowe dane wyjściowe:
$ ./hello_world.sh
Who are you?
Matt
Hello, Matt.
Tutaj użytkownik wprowadził nazwę „Matt”, a ten kod został użyty do powiedzenia „ Hello, Matt.
.
A jeśli chcesz dodać coś do wartości zmiennej podczas drukowania, użyj nawiasów klamrowych wokół nazwy zmiennej, jak pokazano w poniższym przykładzie:
#!/usr/bin/env bash
echo "What are you doing?"
read action
echo "You are ${action}ing."
Przykładowe dane wyjściowe:
$ ./hello_world.sh
What are you doing?
Sleep
You are Sleeping.
W tym przypadku, gdy użytkownik wprowadza akcję, „ing” jest dołączane do tej akcji podczas drukowania.
Obsługa nazwanych argumentów
#!/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
Hello World w trybie „Debuguj”
$ cat hello.sh
#!/bin/bash
echo "Hello World"
$ bash -x hello.sh
+ echo Hello World
Hello World
Argument -x
umożliwia przejście przez każdą linię w skrypcie. Dobry przykład jest tutaj:
$ 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
Podany powyżej błąd nie wystarczy do śledzenia skryptu; jednak użycie następującego sposobu daje lepsze poczucie, gdzie szukać błędu w skrypcie.
$ bash -x hello.sh
+ echo Hello World\n
Hello World
+ adding_string_to_number=s
+ expr 5 + s
expr: non-integer argument
+ v=
Znaczenie cytowania w ciągach
Cytowanie jest ważne dla rozwijania łańcucha w bash. Dzięki nim możesz kontrolować, w jaki sposób bash analizuje i rozwija swoje łańcuchy.
Istnieją dwa rodzaje cytowania:
- Słaby : używa podwójnych cudzysłowów: „
- Mocne : używa pojedynczych cudzysłowów: „
Jeśli chcesz bash rozwinąć argument, możesz użyć Słabego cytowania :
#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World
Jeśli nie chcesz bash, aby rozwinąć argument, możesz użyć silnego cytowania :
#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world
Możesz także użyć klawisza Escape, aby zapobiec ekspansji:
#!/usr/bin/env bash
world="World"
echo "Hello \$world"
#> Hello $world
Aby uzyskać bardziej szczegółowe informacje inne niż informacje dla początkujących, możesz je dalej przeczytać tutaj .