GNU/Linux >> Znalost Linux >  >> Linux

Bash — analyzovat příznaky a očekávaný (nevolitelné) argument?

$ 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

Linux
  1. Jak analyzovat soubor CSV v Bash?

  2. Pomocí a ve smyčce Bash while

  3. Zachovat uvozovky v argumentech bash

  1. Jaký je rozdíl mezi #!/usr/bin/env bash a #!/usr/bin/bash?

  2. Jak analyzovat hlavičky HTTP pomocí Bash?

  3. ssh klíče ssh-agent bash a ssh-add

  1. Bash pro průvodce smyčkou a příklady

  2. V Bash, kdy alias, kdy skript a kdy napsat funkci?

  3. Pokračování bash line po &&a || Zdokumentováno?