$ bash file.sh expected_arg -f optional_arg
Ich habe Beiträge gesehen, die $1
adressieren um das erste Argument zu greifen
und postet diese Adresse unter Verwendung von getopts zum Analysieren von Flag-Argumenten. Ich habe keinen Beitrag gesehen, der beides anspricht.
Ich greife gerade auf expected_arg
zu über $1
.
Ich kann das -f
nicht verarbeiten Flagge überhaupt. Obwohl ich dies auch in meinem Testskript habe:
#!/bin/bash
dirname=$1
[[ -z $dirname ]] && echo "Project name required as an argument." && return
# get flags
verbose='false'
aflag='false'
bflag='false'
files='false'
while getopts 'abf:v' flag; do
case "${flag}" in
a) aflag='true' ;;
b) bflag='true' ;;
f) files="${OPTARG}" ;;
v) verbose='true' ;;
*) error "Unexpected option ${flag}" ;;
esac
done
echo "$files"
echo "$HOME/Desktop/$dirname"
exit
Das Terminal zeigt:
Jills-MBP:~ jillr$ bash test.sh blah -f file
false
/Users/jillr/Desktop/blah
Es sei denn Ich ändere die Reihenfolge der Argumente, wie in:
bash file.sh -f optional_arg expected_arg
Was das Terminal ausgibt:
Jills-MBP:~ jillr$ bash test.sh -f file blah
file
/Users/jillr/Desktop/-f
Also wird -f natürlich als $1
verarbeitet , was ich nicht will. Ich muss das erwartete Argument holen
Erforderliche Einschränkungen:
- Ich muss eine unterschiedliche Anzahl von Flags zulassen (von gar keinen bis zu mehreren). Daher wird die Position von "expected_arg" variieren
- expected_arg ist ein Muss
- Ich würde es lieber vermeiden, ein anderes Flag verwenden zu müssen, um den erwarteten_arg zu analysieren (wie in, ich möchte vermeiden, etwas wie
$ bash test.sh -f file -d blah
zu tun )
Wie kann ich diese Einschränkungen erfüllen?
Akzeptierte Antwort:
Egal. Ich habe diesen Beitrag gefunden:Using getopts to parse options after a non-option argument
was im Grunde besagt, dass ich mein Problem lösen kann, indem ich einfach shift
platziere nach dirname=$1
Dadurch können die Argumente als
eingegeben werden$ bash file.sh expected_arg -f optional_arg