Grenar i Bash kör ofta fel sökväg när strängjämförelser använder den numeriska operatorn-eqeller när variabler lämnas utan citat. Byter till Bash's[[ ]]test med rätt operatörer fixar dessa logiska fel och gör skript lättare att underhålla.
Metod 1: Skriv om ... annat med Bash[[ ]](strängar, siffror och filer)
Steg 1:Skapa ett nytt skript och lägg till ett minimalt villkor med den moderna Bash-testsyntaxen[[ ]]. Denna form undviker oavsiktlig globexpansion och orddelning, vilket minskar överraskande beteende jämfört med enkla parenteser.
#!/usr/bin/env bash
set -euo pipefail
read -r -p "Enter a value: " val
if [[ "$val" == "admin" ]]; then
echo "Welcome, admin."
else
echo "Access limited."
fiSteg 2:Jämför strängar med==eller!=. Citera variabler för att förhindra att tomma värden och mellanslag bryter dina tester. Detta förhindrar oavsiktliga matchningar orsakade av expansioner utan citat.
user="alice"
target="alice"
if [[ "$user" == "$target" ]]; then
echo "Usernames match."
else
echo "Usernames differ."
fiSteg 3:Använd numeriska operatorer för heltal inuti[[ ]]:-eq,-ne,-gt,-ge,-lt,-le. Dessa fungerar endast på siffror och undviker lexikografiska jämförelser.
read -r -p "Enter a number: " n
if [[ "$n" -gt 10 ]]; then
echo "Greater than 10."
elif [[ "$n" -eq 10 ]]; then
echo "Equal to 10."
else
echo "Less than 10."
fiSteg 4:Kontrollera filer med filtestoperatörer. Dessa hjälper dig att förgrena dig baserat på filsystemets tillstånd utan att köra externa kommandon.
-f path: vanlig fil finns.-d path: katalogen finns.-e path: sökväg finns (vilken typ som helst).-x path: körbar fil finns.-r path/-w path: läsbar / skrivbar.
path="./data.txt"
if [[ -f "$path" ]]; then
echo "File exists."
else
echo "Creating file..."
: > "$path"
fiSteg 5:Kombinera villkor med&&(OCH),||(ELLER), och!(INTE). Gruppera dem med parenteser för tydlighet och korrekt företräde.
file="./report.log"
size=5
# True when the file exists AND size is at least 5
if [[ -f "$file" ]] && [[ "$size" -ge 5 ]]; then
echo "Process report."
fi
# True when user is admin OR staff
role="staff"
if [[ "$role" == "admin" || "$role" == "staff" ]]; then
echo "Privileged."
fi
# Negation: path exists but is not a directory
if [[ -e "$file" && ! -d "$file" ]]; then
echo "Path is not a directory."
fiSteg 6:Användaeliftill kortslutningskontroller. När ett villkor är sant, hoppas senare grenar över, vilket påskyndar utvärderingen och minskar onödiga kommandon.
status="warning"
if [[ "$status" == "error" ]]; then
echo "Exit immediately."
exit 1
elif [[ "$status" == "warning" ]]; then
echo "Log and continue."
else
echo "All good."
fiMetod 2: Jämför heltal med(( ))aritmetisk utvärdering
Steg 1:Använd aritmetiska sammanhang för numerisk logik. Inuti(( )), du kan skriva matematikliknande jämförelser (<,>,==) utan att citera variabler. Detta är kortfattat och snabbt för kontroller av enbart heltal.
a=12 b=8
if (( a > b )); then
echo "a is larger."
elif (( a == b )); then
echo "Equal."
else
echo "b is larger."
fiSteg 2:Kombinera booleska operatorer direkt i aritmetiska sammanhang. Detta minskar plattan vid utvärdering av flera numeriska förhållanden.
x=7 y=3 z=10
if (( (x > y) && (z >= 10) )); then
echo "Threshold met."
fiSteg 3:Validera indata. Aritmetiska sammanhang behandlar icke-numeriska värden som noll. Om inmatningen kan vara icke-numerisk, skydda den med ett regextest in[[ ]]innan man utvärderar.
read -r n
if [[ "$n" =~ ^-?[0-9]+$ ]] && (( n >= 0 )); then
echo "Non-negative integer."
else
echo "Invalid number."
fiMetod 3: Använd POSIX-portable[ ]för bredare skalkompatibilitet
Steg 1:Föredrar enkla parenteser när du riktar in skal bortom Bash (t.ex./bin/sh). Kom ihåg det[är ett kommando: mellanslag och citat krävs.
#!/bin/sh
a="hello"
b="hello"
if [ "$a" = "$b" ]; then
echo "Match."
else
echo "No match."
fiSteg 2:Använd numeriska operatorer för heltal och citattecken för att förhindra orddelning. Detta undviker buggar när variabler är tomma eller innehåller mellanslag.
a=5
b=30
if [ "$a" -lt "$b" ]; then
echo "a is less than b."
fiSteg 3:När man gör lexikografiska strängjämförelser med<eller>, undkomma operatörerna för att förhindra omdirigering. Många fel beror på att man glömmer detta.
x="apple" y="banana"
if [ "$x" < "$y" ]; then
echo "apple comes before banana."
fiSteg 4:Använd filtester på samma sätt som i[[ ]], men håll allt citerat för att undvika kantfall.
file="./cfg.ini"
if [ -r "$file" ] && [ -w "$file" ]; then
echo "Config is readable and writable."
fiMetod 4: Byt ut långa kedjor motcaseför värdebaserad förgrening
Steg 1:Användacaseför att förenkla flera likhetskontroller av en enda variabel. Detta minskar kapsladeifblockerar och förbättrar läsbarheten och hastigheten vid matchning av mönster.
read -r -p "Enter mode (start|stop|status): " mode
case "$mode" in
start) echo "Starting...";;
stop) echo "Stopping...";;
status) echo "Service is running.";;
*) echo "Unknown mode."; exit 1;;
esacSteg 2:Matcha flera mönster enkelt. Detta håller din logik kompakt och undviker upprepade variabeljämförelser.
level="warn"
case "$level" in
error|err) echo "Exit with failure."; exit 1;;
warn|warning) echo "Log warning.";;
info|debug) echo "Proceed normally.";;
*) echo "Unrecognized level.";;
esacMetod 5: Testa flera villkor korrekt och felsöka fel
Steg 1:Gruppera boolesk logik för att återspegla din sanningstabell. Till exempel, "kräver Z eller både X och Y" blirif [[ "$Z" == "TRUE" || ( "$X" == "TRUE" && "$Y" == "TRUE" ) ]]. Parenteser förtydligar prioritet och förhindrar subtila buggar.
X="TRUE" Y="FALSE" Z="TRUE"
if [[ "$Z" == "TRUE" || ( "$X" == "TRUE" && "$Y" == "TRUE" ) ]]; then
echo "Conditions met."
else
echo "Conditions not met."
fiSteg 2:Välj rätt operatörer. Använda==för strängar och-eqför heltal. Att blanda dem orsakar felaktiga grenar (t.ex. sträng jämfört med-eqmisslyckas alltid).
Steg 3:Citera variabla expansioner i tester, speciellt med enkla parenteser. Citering undviker krascher när variabler är tomma och förhindrar expansion av jokertecken mot filsystemposter.
Steg 4:Spåra logik när resultaten ser fel ut. Aktivera xtrace för att se varje utökat kommando och tillstånd när Bash utvärderar det.
#!/usr/bin/env bash
set -x # turn on trace
# ... your conditionals here ...
set +x # turn off traceSteg 5:Håll skript konsekventa och läsbara. Dra in kroppen underthen/else, lämna mellanrum runt parenteser och gynna tidiga utgångar på felgrenar för att minska häckningen.
Referens: Vanliga testoperatörer i korthet
Den här snabblistan hjälper dig att välja rätt operatör för jobbet.
- Strängar:
==,!=,-n var(längd > 0),-z var(tömma). - Heltal:
-eq,-ne,-gt,-ge,-lt,-le; eller använda(( ))med<,>,==. - Filer:
-f(regelbunden),-d(katalog),-e(finns),-x(körbar),-r(läsbar),-w(skrivbar). - Logik:
&&(OCH),||(ELLER),!(INTE); grupp med( ... )inuti[[ ]].
Med rätt testformulär, korrekta operatorer och konsekvent citering, exekverar dina Bash-villkor den avsedda grenen varje gång. Hålla[[ ]]för Bash-skript, använd(( ))för matematik, och falla tillbaka till[ ]endast när portabilitet är ett måste.
Se även:Felkod 0-2031 (17002) Microsoft Office-installationsproblem













