
Mnohokrát se při psaní skriptů Shell můžete dostat do situace, kdy potřebujete provést akci podle toho, zda soubor existuje či nikoli.
V Bash můžete pomocí příkazu test zkontrolovat, zda soubor existuje, a určit typ souboru.
Příkaz test má jednu z následujících forem syntaxe:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
Pokud chcete, aby byl váš skript přenosný, měli byste raději použít starý test [
příkaz, který je dostupný ve všech shellech POSIX. Nová upgradovaná verze testovacího příkazu [[
(dvojité závorky) je podporována na většině moderních systémů používajících Bash, Zsh a Ksh jako výchozí prostředí.
Zkontrolovat, zda soubor existuje #
Při kontrole, zda soubor existuje, jsou nejběžněji používané operátory FILE -e
a -f
. První zkontroluje, zda soubor existuje bez ohledu na typ, zatímco druhý vrátí true pouze v případě, že SOUBOR je běžný soubor (ne adresář nebo zařízení).
Nejčitelnější možností při kontrole, zda soubor existuje nebo ne, je použít test
příkaz v kombinaci s if
prohlášení. Kterýkoli z níže uvedených úryvků zkontroluje, zda /etc/resolv.conf
soubor existuje:
FILE=/etc/resolv.conf
if test -f "$FILE"; then
echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [[ -f "$FILE" ]]; then
echo "$FILE exists."
fi
Pokud chcete provést jinou akci podle toho, zda soubor existuje nebo ne, jednoduše použijte konstrukci if/then:
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
echo "$FILE exists."
else
echo "$FILE does not exist."
fi
Vždy používejte dvojité uvozovky, abyste se vyhnuli problémům při práci se soubory obsahujícími mezery v názvech.
Příkaz test můžete použít i bez příkazu if. Příkaz za &&
Operátor bude proveden pouze v případě, že výstupní stav příkazu testu je pravdivý,
test -f /etc/resolv.conf && echo "$FILE exists."
[ -f /etc/resolv.conf ] && echo "$FILE exists."
[[ -f /etc/resolv.conf ]] && echo "$FILE exists."
Pokud chcete spustit řadu příkazů za &&
operátor jednoduše uzavře příkazy do složených závorek oddělených ;
nebo &&
:
[ -f /etc/resolv.conf ] && { echo "$FILE exist."; cp "$FILE" /tmp/; }
Na rozdíl od &&
, příkaz za ||
Operátor bude proveden pouze v případě, že stav ukončení testovacího příkazu je false
.
[ -f /etc/resolv.conf ] && echo "$FILE exist." || echo "$FILE does not exist."
Zkontrolujte, zda adresář existuje #
Operátory -d
umožňuje otestovat, zda je soubor adresářem nebo ne.
Například zkontrolovat, zda /etc/docker
adresář existuje, který byste použili:
FILE=/etc/docker
if [ -d "$FILE" ]; then
echo "$FILE is a directory."
fi
[ -d /etc/docker ] && echo "$FILE is a directory."
Můžete také použít dvojité závorky [[
místo jednoho [
.
Zkontrolovat, zda soubor neexistuje #
Podobně jako v mnoha jiných jazycích lze testovací výraz negovat pomocí !
(vykřičník) logický ne operátor:
FILE=/etc/docker
if [ ! -f "$FILE" ]; then
echo "$FILE does not exist."
fi
Stejné jako výše:
[ ! -f /etc/docker ] && echo "$FILE does not exist."
Zkontrolovat, zda existuje více souborů #
Místo použití složitých vnořených konstrukcí if/else můžete použít -a
(nebo &&
s [[
) pro testování, zda existuje více souborů:
if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
echo "Both files exist."
fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then
echo "Both files exist."
fi
Ekvivalentní varianty bez použití příkazu IF:
[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."
Operátory testu souborů #
Příkaz test obsahuje následující operátory FILE, které vám umožňují testovat konkrétní typy souborů:
-b
FILE
- True, pokud FILE existuje a jedná se o speciální blokový soubor.-c
FILE
- True, pokud SOUBOR existuje a jde o soubor se speciálními znaky.-d
FILE
- True, pokud SOUBOR existuje a jedná se o adresář.-e
FILE
- True, pokud FILE existuje a je souborem, bez ohledu na typ (uzel, adresář, soket atd.).-f
FILE
- True, pokud FILE existuje a je to běžný soubor (nikoli adresář nebo zařízení).-G
FILE
- True, pokud FILE existuje a má stejnou skupinu jako uživatel spouštějící příkaz.-h
FILE
- True, pokud SOUBOR existuje a je symbolickým odkazem.-g
FILE
- True, pokud FILE existuje a má set-group-id (sgid
) sada příznaků.-k
FILE
- True, pokud FILE existuje a má nastaven příznak lepivého bitu.-L
FILE
- True, pokud SOUBOR existuje a je symbolickým odkazem.-O
FILE
- True, pokud SOUBOR existuje a je ve vlastnictví uživatele spouštějícího příkaz.-p
FILE
- True, pokud FILE existuje a je roura.-r
FILE
- True, pokud SOUBOR existuje a je čitelný.-S
FILE
- True, pokud FILE existuje a je to soket.-s
FILE
- True, pokud SOUBOR existuje a má nenulovou velikost.-u
FILE
- True, pokud FILE existuje, a set-user-id (suid
) je nastaven příznak.-w
FILE
- True, pokud SOUBOR existuje a je možné do něj zapisovat.-x
FILE
- True, pokud SOUBOR existuje a je spustitelný.
Závěr č.
V této příručce jsme vám ukázali, jak zkontrolovat, zda soubor nebo adresář v Bash existuje.
Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.