A Bash ideális shell és kódoló nyelv, amely lehetővé teszi csúcskategóriás automatizálási szkriptek létrehozását. A sorozat második részében a kódolási sűrűséget, az inline megjegyzéseket és a helyes változó-idézést egy vagy kettős idézőjelek segítségével vizsgáljuk meg.
Bash automatizálás és szkriptek alapjai
Ha még nem tette meg, és még csak a Bash-ban indul, kérjük, olvassa el a mi oldalunkat Bash automatizálás és szkriptek alapjai 1. rész cikk. Ez a Bash automatizálásról és a szkriptek alapjairól szóló három részből álló sorozatunk második cikke. A mai cikkben többek között a Bash kódolási sűrűséget és annak összefüggését mutatjuk be a fejlesztői preferenciákkal. Az ezzel kapcsolatos beágyazott megjegyzéseket is megvizsgáljuk.
Miután elkezdtük a kis szkriptek létrehozását, a változók feltárását és a szöveges karakterláncokkal való munkát, gyorsan rájövünk, hogy lehet fogalmi különbség az egy- és a kettős idézőjel között. Van, és az alábbi második témában ezt fejtjük ki.
Bash kódolási sűrűség és szűkszavúság
A Bash kódoló nyelv nagyon sűrű és szigorú lehet, ugyanakkor tágas és részletes. Ez nagy mértékben függ a fejlesztői preferenciáktól.
Például a következő Bash-kód:
true || echo 'untrue'
Ami így olvasható Ne tegyen semmit, és tegye ezt sikeresen (0. kilépési kód), és ha ez nem sikerül (elolvashatja a Bash szólást ||
mint OR) adja ki a „valótlan” szöveget, így is írható:
if [ ! true ]; then echo 'untrue' fi
Ami egy kicsit mássá teszi a kódot, de alapvetően ugyanezt teszi.
Ez viszont így olvasható Ha az igaz nem (a !
idióma) true, majd adja ki az „igaz” szöveget.
Mindkét mini szkript ugyanolyan üres kimenetet eredményez, mint igaz nem hamis.
A parancssorból és a parancssorból elérhető (vagy telepíthető) parancsok és eszközök sokasága tovább növeli a könnyen olvasható szkriptek, valamint a nehezen érthető, sűrű és tömör kódok közötti lehetséges eltérést.
Míg a fenti példák rövidek és viszonylag könnyen érthetők, amikor hosszú egyvonalas (ezt a kifejezést a Bash fejlesztői gyakran használják egy olyan kódrészlet jelölésére, amely egy sorba írt több parancsból áll) sok ilyen parancsot használva hoz létre , szemben azzal, hogy ugyanezt egy bonyolultabb szkriptbe helyezzük, a különbség világosabbá válik. Fontolgat:
V="$(sleep 2 & fg; echo -n '1' | sed 's|[0-9]|a|')" && echo "${V}" | sed 's|[a-z]|2|g' || echo 'fail'
Ez egy tipikus Bash egysoros szkript, amely a parancsokat használja sleep
, fg
, echo
, és sed
valamint a különböző Bash-idiómák és reguláris kifejezések, amelyek alapvetően 2 másodpercet alszanak, kiadnak egy kis szöveget, és ezt a szöveget átalakítják a reguláris kifejezések használatával. A szkript a Bash idiómák használatával rendszeresen ellenőrzi a korábbi parancsok feltételeit / eredményeit is ||
(ha nem sikerül, akkor tegye a következőket) és &&
(ha sikerül, tegye a következőket)
Ezt hozzávetőleges illesztési funkciókkal lefordítottam egy teljesebb szkriptbe, némi módosítással. Például felcseréltük a fg
(Hozd a sleep
háttérbe helyezett parancsot az előtérbe, és várja meg, amíg megszűnik, mint a normál, nem háttérfolyamatok) wait
amely megvárja az alvás PID-jét (kezdete: eval
és elfogták a basi szóhasználattal $!
) befejezni.
#!/bin/bash CMD="sleep 2" eval ${CMD} & wait $! EXIT_CODE=${?} V="$(echo -e "${CMD}n1" | sed 's|[0-9]|a|')" if [ ${EXIT_CODE} -eq 0 ]; then echo "${V}" | sed 's|[a-z]|2|g' EXIT_CODE=${?} if [ ${EXIT_CODE} -ne 0 ]; then echo 'fail' fi fi
Elég különbség! És ez igaz egy fejlesztő beírja az ő útja. A mások által írt bash kód általában kissé kihívást jelent az olvasás szempontjából, és ez a nehézség gyorsan növekszik a sűrűség és a szűkszavúság mellett. Ennek ellenére a Bash szakértői szintű fejlesztője gyorsan meg fogja érteni a mások által írt nagyon sűrű és rövid kódokat is, néhány kivételtől eltekintve, például a reguláris kifejezésektől.
Ha többet szeretne megtudni a reguláris kifejezések írásáról, nézze meg Szöveg módosítása a reguláris kifejezések használatával a sed Stream szerkesztővel.
Ezekből a példákból egyértelmű, hogy a futásteljesítménye idővel változni fog. Általában azonban a kódoló társbarát (jól olvasható kód beírásával) ajánlott, amikor elkezdi fejleszteni a Bash parancsfájlokat.
Ha sűrű és rövid kódot kell létrehoznia, rengeteg inline megjegyzést adhat meg. A előtagú sor #
megjegyzés / megjegyzés sornak és szimbólumnak számít #
akár egy sor vége felé is használható bármely futtatható parancs után, utótaggal ellátott megjegyzés elküldéséhez, amely elmagyarázza a parancsot, a feltételes utasítást stb. Például:
# This code will sleep one second, twice sleep 1 # First sleep sleep 1 # Second sleep
Egyetlen vagy kettős idézet?
Bash-ben az idézőjelek közötti szöveg ('
) a Bash-tolmács szó szerinti szövegnek tekinti, míg a dupla idézőjelek közötti szöveget ("
) értelmezi (értelmezi) a Bash-tolmács. Míg a különbség a dolgok működésében nem feltétlenül egyértelmű ebből a meghatározásból, a következő példa megmutatja, mi történik, amikor cserélünk '
mert "
és fordítva:
echo ' $(echo "Hello world") ' echo " $(echo 'Hello world') "
Az első példában a szöveget $(echo "Hello world")
szó szerinti szövegnek tekinthető, ezért a kimenet egyszerűen $(echo "Hello world")
. A második példához azonban a kimenet az Hello world
.
A Bash-tolmács kettős idézőjelek között elemezte a szöveget, hogy lássa, talál-e valamilyen speciális Bash-idiómát, amelyre cselekedhetne. Egy ilyen idiómát találtak $( ... )
amely alapvetően alhéjat indít és végrehajt minden, ami a ( ... )
idiómák. Gondoljon rá, mint egy shellre egy shellben – egy alhéjra -, amely teljesen új parancsként végrehajtja azt, amit átad neki. Az ilyen parancsok vagy parancsok kimenete ezután visszakerül a legfelső szintű héjba, és pontosan oda kerül, ahol az alhéj elindult.
Így az alhéjunk kivégzett echo 'Hello world'
amelynek a kimenete Hello world
. Miután ez megtörtént, az alhéj befejeződött, és a szöveg Hello world
helyett került be $( ... )
alhéj invokáció (gondoljon bele úgy, mint az összes $( ... )
kódot kicseréli az alhéj által generált bármely kimenetre.
Az eredmény a felső héj esetében a következő parancs: echo " Hello world "
, amelynek a kimenete Hello world
ahogy láttuk.
Ne feledje, hogy az alhéjban lévő dupla idézőjeleket egyetlen idézetekre változtattuk. Ez nem szükséges! Elképzelhető, hogy értelmezési hiba jelentkezik, amikor a parancs felveszi a szintaxist echo " ... " ... " ... "
, abban az esetben, ha a második kettős idézőjel befejezi az elsőt, majd további tesztet végez, és így hibához vezet. Ez azonban nem így van.
És ez nem azért van, mert a Bash rugalmas a többször idézett karakterláncokkal (elfogadja echo 'test'"More test"'test'
például nagyon boldogan), hanem azért, mert az alhéj önmagában egy héj, és így ismételten dupla idézőjeleket lehet használni az alhéjban. Igazoljuk ezt egy további példával:
echo "$(echo "$(echo "more double quotes")")"
Ez jól fog működni és előállítja a kimenetet more double quotes
. A két beágyazott alhéj (amely a fő héjban fut, amelyből ezt végrehajtja) egymás után kettős idézőjelet fogad el, és nem keletkezik hiba, még akkor sem, ha több dupla idézőjel van egymásba ágyazva az egyvonalas parancsban. Ez megmutatja a Bash programozási erejét.
Összefoglalva
A kódolási sűrűség feltárása után rájövünk a jól olvasható kód írásának értékére. Ha ennek ellenére sűrű és rövid kódot kell készítenünk, rengeteg inline megjegyzést adhatunk a segítségével #
az olvashatóság elősegítése érdekében. Megnéztük az egy- és a kettős idézeteket, és hogy azok funkcionalitása mennyiben különbözik egymástól. Röviden áttekintettük a szöveges megjegyzéseket a szkriptekben, valamint az alhéj funkcionalitását, amikor kettős idézőjelű karakterláncról hajtjuk végre. Végül láttuk, hogy az alhéj hogyan használhat egy másik dupla idézőjelet anélkül, hogy ez bármilyen módon befolyásolná a magasabb szinten használt dupla idézőjeleket. Maradjanak velünk a 3. részen!