2015-05-27 24 views
9

Piszę skrypt powłoki, który ma działać na wielu maszynach. Niektóre z tych maszyn ma bash bash 2 lub 3. Niektóre są uruchomione BusyBox 1.18.4 gdzie bin/bash istnieje, alePrzenośny sposób budowania argumentów dla narzędzia w powłoce?

  • /bin/bash --version niczego nie wrócić wcale
  • foo=("hello" "world") narzeka błąd składni w pobliżu nieoczekiwanego "(" zarówno zi bez dodatkowych spacji wewnątrz parens ... więc tablice wydają się być ograniczone lub nieobecne

Istnieją również bardziej nowoczesne lub w pełni funkcjonalne wersje Linux i bash.

Jaki jest najbardziej przenośny sposób, w jaki skrypt basha buduje argumenty w czasie wykonywania w celu wywołania narzędzia takiego jak find? Mogę zbudować ciąg, ale uważam, że tablice będą lepszym wyborem. Wyjątkiem jest, że drugi podpunkt powyżej ...

Powiedzmy mój skrypt jest foo i nazwać go tak: foo -o 1 .jpg .png

Oto niektóre pseudo-code

#!/bin/bash 

# handle option -o here 
shift $(expr $OPTIND - 1) 

# build up parameters for find here 
parameters=(my-diretory -type f -maxdepth 2) 
if [ -n "$1" ]; then 
    parameters+=-iname '*$1' -print 
    shift 
fi 

while [ $# -gt 0 ]; do 
    parameters+=-o -iname '*$1' -print 
    shift 
done 

find <new positional parameters here> | some-while-loop 

Odpowiedz

7

Jeśli trzeba użyć głównie -POSIX sh, takie jak byłyby dostępne w BusyBox popiołu nazwie-bash, można budować parametrów pozycyjnych bezpośrednio z set

$ set -- hello 
$ set -- "[email protected]" world 
$ printf '%s\n' "[email protected]" 
hello 
world 

Dla bardziej apt przykład:

$ set -- /etc -name '*b*' 
$ set -- "[email protected]" -type l -exec readlink {} + 
$ find "[email protected]" 
/proc/mounts 
+0

Jeśli używam 'set --' w moim skrypcie, czy to odrzuca argumenty, które zostały pierwotnie przekazane? Używam ich do budowania argumentów dla 'find' ... – user1011471

+0

Po przekazaniu parametrów pozycyjnych są one dostępne w zmiennej' '$ @" '. Więc jeśli chcesz dodać _more_ parametry pozycyjne, musisz zrobić coś jak 'set -" $ @ "- more - more - more'. Ma sens? – kojiro

+0

Oh. Co chciałem zrobić, to zmienić parametry pozycyjne moich skryptów w coś dla 'find', a następnie wywołać' find'. Ale tutaj '' $ @ "' jest używane zarówno dla ... – user1011471

2

Podczas gdy pytanie dotyczy więcej niż tylko Bash, można skorzystać z lektury Wooledge atakujących nas na ten temat:

http://mywiki.wooledge.org/BashFAQ/050

Wspomina wykorzystanie "set -" dla starszych powłok, ale także daje wiele informacji podstawowych. Podczas budowania listy argumentów łatwo jest stworzyć system działający w prostych przypadkach, ale zawiedzie, gdy dane zawierają znaki specjalne, więc prawdopodobnie warto przeczytać na ten temat.