Portál AbcLinuxu, 10. května 2025 05:28

Dotaz: bash argumenty spouštění a system property javy

16.10.2008 10:57 Pev | skóre: 28
bash argumenty spouštění a system property javy
Přečteno: 510×
Odpovědět | Admin
Dobrý den,

pomocí bash skriptu spouštím javovský program.

Používám getopts na pársování parametrů, parametry jsou většinou normální:
-l soubor
-v
-q
-P soubor
Problém je v tom, že bych potřeboval, aby tam šel dát i prarametr javovské system properties, tedy něco jako
-Dparam=value
-Dfoo=bar
Getopts očekávají jediné písmenko, tak je to zmate. Situaci ještě komplikuje skutečnost, že ty -D parametry by tam měly být víckrát než jednou.

Zkoušel jsem -D parametry odchytit na začátku pomocí regulárních výrazů, ale nějak je nedokážu pomocí bashe odstranit (ani tento návod nepomohl). Řešení by totiž bylo uložit tyto volby do samostatné proměné, a hlavně je odfiltrovat z parametrů getopts. Mám na to použít externí nástroj (sed, awk, expr, ...)?

Ideální by bylo, kdyby ten způsob nebyl bash only, ale fungoval třeba i v dash a ksh, ...

Jo, určitě by šlo udělat mapování voleb na jednotlivé system properties (tj. -f ve výsledku předá jave -Dfoo=bar), ale to není to co hledám.

Ještě, jde v bash implementaci getopts použít long options, jako jdou třeba v pythonu?

Díky za tipy.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

16.10.2008 14:14 Jan Šimák | skóre: 37 | Hradec Králové
Rozbalit Rozbalit vše Re: bash argumenty spouštění a system property javy
Odpovědět | | Sbalit | Link | Blokovat | Admin
Místo getopts je možné použít getopt, který podporuje dlouhé volby:
#!/usr/bin/env bash
#set -x

scriptname=`basename $0`
args=`getopt -n "$scriptname" -o v: --long arg1:,arg2:,arg3 -- "$@"`
eval set -- "$args"

while true; do
	case "$1" in
		--arg1)
			echo "arg1: $2"; shift 2
			;;
		--arg2)
			echo "arg2: $2"; shift 2
			;;
		--arg3)
			echo "arg3: $2"; shift 2
			;;
		-v)
			echo "volba v: $2"; shift 2
			;;
		--)
			break
			;;
	esac
done
Volání scriptu:
./run.sh --arg1 123 --arg1 456 --arg1=789 -v konec
arg1: 123
arg1: 456
arg1: 789
volba v: konec
V man je uvedeno, že getopt je podporován v těchto shellech: sh, bash, csh, tcsh.
16.10.2008 14:55 Pev | skóre: 28
Rozbalit Rozbalit vše Re: bash argumenty spouštění a system property javy
Díky moc za tip, jak používat dlouhé volby.

Teď zůstává ještě vyřešit ty system properties.

Představoval jsem si to, že by to nějak bylo schopné odfiltrovat všechny -D[^=]\+=[^ ]\+, ale to bych asi chtěl moc :-(.
16.10.2008 15:37 Jan Šimák | skóre: 37 | Hradec Králové
Rozbalit Rozbalit vše Re: bash argumenty spouštění a system property javy
Můžete uvést konkrétní příklad. Nepochopil jsem přesně jaký bude vstup a co by jste z toho chtěl mít na výstupu.
19.10.2008 18:11 luky
Rozbalit Rozbalit vše Re: bash argumenty spouštění a system property javy
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nechapu proc by getopts melo byt zmatene, nebo proc by vicenasobny vyskyt -D mel cokoliv komplikovat. Nemuzu rict, ze jsem pochopil o co vam jde, ale zkratka uplne stejne jako zpracovavate ostatni volby, muzete zpracovavat i to -D, at uz s nim zamyslite cokoliv.
$ cat xx.sh
#!/bin/bash
while getopts "D:" OPT; do
        echo "$OPT $OPTARG"
done
$ ./xx.sh -D x -Dy -D foo=bar -Djoe=doe
D x
D y
D foo=bar
D joe=doe

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.