Shell scripting: -z en -n opties met if

Ik heb een shell-script waar we de volgende regels hebben if [ -z "$xyz" ] en if [ -n "$abc" ], maar ik weet niet zeker wat hun doel is. Kan iemand het alsjeblieft uitleggen?

Answer

Je kunt een erg mooie referentie vinden voor bash “s operatoren hier . Als je een andere shell gebruikt, zoek dan gewoon naar <my shell> operators en je zult alles vinden wat je nodig hebt. In jouw specifieke geval ben je met:

-n string is not null. -z string is null, that is, has zero length 

Ter illustratie:

$ foo="bar"; $ [ -n "$foo" ] && echo "foo is not null" foo is not null $ [ -z "$foo" ] && echo "foo is null" $ foo=""; $ [ -n "$foo" ] && echo "foo is not null" $ [ -z "$foo" ] && echo "foo is null" foo is null 

Reacties

  • Als je problemen hebt om -n aan het werk te krijgen, kan het zijn dat je een aantal slechte richtlijnen op internet volgt (bijvoorbeeld GeeksforGeeks of TutorialsPoint ) die de variabelen niet citeren. Dit antwoord, en de gids die hier gelinkt is, citeren correct het. Als je -n gebruikt zonder aanhalingstekens, zal het je vertellen dat het ' niet leeg is, zelfs als het is! @terdon, heel erg bedankt!

Antwoord

man test of man [ geeft je alle opties om een commando te testen. In dit geval test -n of de inhoud van $ abc een lengte heeft die niet nul is en -z test of de inhoud van $ xyz een tekenreeks met lengte nul is.

Opmerkingen

  • man [doesn ' werkt niet voor mij in GNU bash, versie 4.1.2 (1) -release (x86_64- redhat-linux-gnu). Maar +1 voor man-test.
  • Opmerking man test (altijd?) Geeft de man-pagina voor de externe programmaversie, die (voor GNU-coreutils-versie op least) waarschuwt expliciet dat sommige (meest IME) shells een ingebouwde versie hebben die anders kan zijn.

Answer

Om terdon “s antwoord uit te breiden, vond ik dat Unix / Linux – Shell Basic Operators op Tutorials Point bevat ook bestandsgerelateerde operatoren (evenals andere nuttige).

-b file Checks if file is a block special file; if yes, then the condition becomes true. [ -b $file ] is false. -c file Checks if file is a character special file; if yes, then the condition becomes true. [ -c $file ] is false. -d file Checks if file is a directory; if yes, then the condition becomes true. [ -d $file ] is not true. -f file Checks if file is an ordinary file as opposed to a directory or special file; if yes, then the condition becomes true. [ -f $file ] is true. -g file Checks if file has its set group ID (SGID) bit set; if yes, then the condition becomes true. [ -g $file ] is false. -k file Checks if file has its sticky bit set; if yes, then the condition becomes true. [ -k $file ] is false. -p file Checks if file is a named pipe; if yes, then the condition becomes true. [ -p $file ] is false. -t file Checks if file descriptor is open and associated with a terminal; if yes, then the condition becomes true. [ -t $file ] is false. -u file Checks if file has its Set User ID (SUID) bit set; if yes, then the condition becomes true. [ -u $file ] is false. -r file Checks if file is readable; if yes, then the condition becomes true. [ -r $file ] is true. -w file Checks if file is writable; if yes, then the condition becomes true. [ -w $file ] is true. -x file Checks if file is executable; if yes, then the condition becomes true. [ -x $file ] is true. -s file Checks if file has size greater than 0; if yes, then condition becomes true. [ -s $file ] is true. -e file Checks if file exists; is true even if file is a directory but exists. [ -e $file ] is true. 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *