$ bash file.sh expected_arg -f optional_arg
Viděl jsem příspěvky s adresou $1
uchopit první argument
a příspěvky, které řeší pomocí getopts pro analýzu argumentů příznaku. Neviděl jsem příspěvek, který by se týkal obou.
Momentálně přistupuji k expected_arg
prostřednictvím $1
.
Nemohu zpracovat -f
vlajka vůbec. I když to mám také ve svém testovacím skriptu:
#!/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
Terminál zobrazuje:
Jills-MBP:~ jillr$ bash test.sh blah -f file
false
/Users/jillr/Desktop/blah
Pokud Změním pořadí argumentů jako v:
bash file.sh -f optional_arg expected_arg
Které výstupy terminálu:
Jills-MBP:~ jillr$ bash test.sh -f file blah
file
/Users/jillr/Desktop/-f
Takže přirozeně, -f je zpracováno jako $1
, což není to, co chci. Potřebuji získat očekávaný_arg
Potřebná omezení:
- Musím povolit různý počet příznaků (od žádných po několik). Pozice očekávaného_argu se proto bude lišit
- expected_arg je nutnost
- Raději bych se vyhnul nutnosti používat jiný příznak, abych mohl analyzovat expect_arg (jako v, chci se vyhnout provádění něčeho jako
$ bash test.sh -f file -d blah
)
Jak mohu splnit tato omezení?
Přijatá odpověď:
Nevadí. Našel jsem tento příspěvek:Použití getopts k analýze možností po argumentu bez možnosti
což v podstatě říká, že mohu svůj problém vyřešit jednoduše umístěním shift
po dirname=$1
Což umožní zadat argumenty jako
$ bash file.sh expected_arg -f optional_arg