hur man korrekt analyserar skalskriptsflaggor och argument med hjälp av getopts

I ”m använder detta:

till exempel ./imgSorter.sh -d directory -f format

skriptets” innehåll är:

#!/bin/bash while getopts ":d:f:" opt; do case $opt in d) echo "-d was triggered with $OPTARG" >&2 ;; f) echo "-f was triggered with $OPTARG" >&2 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done 

användningsfall:

$ ./imgSorter.sh -d myDir -d was triggered with myDir OK

$ ./imgSorter.sh -d -f myFormat -d was triggered with -f NOK: hur är det att en sträng som börjar med – inte detekteras som en flagga?

Svar

Du har sagt till getopts att -d -alternativet ska ta ett argument, och på kommandoraden använder du -d -f myformat som tydligt (?) säger ”-f är argument jag ”ger till -d -alternativet.

Detta är inte ett fel i koden utan i användningen av skriptet på kommandoraden.

Din kod måste verifiera att alternativargumenten är korrekta och att alla alternativ är inställda på lämpligt sätt.

Eventuellt något liknande

while getopts "d:f:" opt; do case $opt in d) dir=$OPTARG ;; f) format=$OPTARG ;; *) echo "error" >&2 exit 1 esac done # If -d is *required* if [ ! -d "$dir" ]; then echo "Option -d missing or designates non-directory" >&2 exit 1 fi # If -d is *optional* if [ -n "$dir" ] && [ ! -d "$dir" ]; then echo "Option -d designates non-directory" >&2 exit 1 fi 

Om alternativet -d är valfritt och om du vill använda ett standard -värde för variabeln dir i koden ovan skulle du börja med att ställa in dir till det standardvärdet före while loop.

Ett kommandoradsalternativ kan inte både ta och inte ta ett argument.

Kommentarer

  • ok tack @Kusalananda, jag antog felaktigt att getopts tog varje – för början av en flagga.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *