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ů:
-bFILE- True, pokud FILE existuje a jedná se o speciální blokový soubor.-cFILE- True, pokud SOUBOR existuje a jde o soubor se speciálními znaky.-dFILE- True, pokud SOUBOR existuje a jedná se o adresář.-eFILE- True, pokud FILE existuje a je souborem, bez ohledu na typ (uzel, adresář, soket atd.).-fFILE- True, pokud FILE existuje a je to běžný soubor (nikoli adresář nebo zařízení).-GFILE- True, pokud FILE existuje a má stejnou skupinu jako uživatel spouštějící příkaz.-hFILE- True, pokud SOUBOR existuje a je symbolickým odkazem.-gFILE- True, pokud FILE existuje a má set-group-id (sgid) sada příznaků.-kFILE- True, pokud FILE existuje a má nastaven příznak lepivého bitu.-LFILE- True, pokud SOUBOR existuje a je symbolickým odkazem.-OFILE- True, pokud SOUBOR existuje a je ve vlastnictví uživatele spouštějícího příkaz.-pFILE- True, pokud FILE existuje a je roura.-rFILE- True, pokud SOUBOR existuje a je čitelný.-SFILE- True, pokud FILE existuje a je to soket.-sFILE- True, pokud SOUBOR existuje a má nenulovou velikost.-uFILE- True, pokud FILE existuje, a set-user-id (suid) je nastaven příznak.-wFILE- True, pokud SOUBOR existuje a je možné do něj zapisovat.-xFILE- 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ář.