Trochę utknąłem. Moim zadaniem jest wydrukowanie argumentów na skrypcie w odwrotnej kolejności, z wyjątkiem trzeciej i czwartej.
Mam ten kod:
#!/bin/bash
i=$#
for arg in "$@"
do
case $i
in
3) ;;
4) ;;
*) eval echo "$i. Parameter: \$$i";;
esac
i=`expr $i - 1`
done
Ponieważ nienawidzę eval (pozdrowienia dla PHP), szukam rozwiązania bez niego, ale nie jestem w stanie go znaleźć.
Jak mogę dynamicznie zdefiniować pozycję argumentu?
PS: Nie, to nie praca domowa, uczę się muszli do egzaminu, więc staram się rozwiązywać stare egzaminy.
źródło
arg
ponieważ są one uporządkowane poprawnie, a nie odwrotnie. Do użyciaexpr
ograniczam się tylko do korzystania ze standardu.#!/bin/bash
, możesz użyć${!i}
i(())
. Jeśli chcesz trzymać się standardowego sh, nie są one dostępne, ale$((…))
są.eval
nie jest jedynym przenośnym sposobem, jak pokazał Ryan .Trzymam skrypt
reverse
na mojej ścieżce, który robi to:Przykładowe użycie:
Możesz także użyć funkcji zamiast dedykowanego skryptu.
źródło
$#
? Czy może to być coś innego niż nieujemna liczba całkowita?local arg=$1
Jest to prawidłowe i niegroźne użycie eval. Masz pełną kontrolę nad tworzoną treścią
eval
.Jeśli nadal sprawia ci to złe przeczucia, to jeśli nie zależy ci na przenośności, możesz użyć
${!i}
składni pośredniej Basha .źródło
${!i}
nie jest częścią standardowej składni?Zakładając, że parametry pozycyjne nie zawierają znaków nowej linii:
Test:
Wyjście testowe:
źródło
Z
zsh
:Oa
jest flagą rozwinięcia parametru do sortowania elementów tablicy po rozwinięciu w indeksach tablicy odwrotnej .Aby wykluczyć 3 i 4:
źródło
Z praktycznie każdą powłoką:
I nie musisz używać podpowłoki. Na przykład:
... drukuje ...
A oto funkcja powłoki, która może ustawić
alias
dla ciebie powłokę , która wypisze argumenty do przodu lub do tyłu:Nie próbuje przechowywać wartości literałów dla żadnych argumentów, ale umieszcza taki ciąg w
args
alias
:... i dlatego przechowuje tylko odniesienia do parametrów wstecz i do przodu. Będzie przechowywać do liczby podanej jako argument. Tak więc powyższe
alias
zostało wygenerowane jak:printf
Na zachowanie ma wpływ wartość zwracana z poprzedniego polecenia - które zawsze jest:
poleceniem zerowym, a więc zwykle prawdziwe.printf
pominie połowę swoich argumentów przy każdym drukowaniu - co domyślnie spowoduje wydrukowanie argumentów od najmniejszej do największej. Jeśli jednak po prostu to zrobisz:... drukuje je w odwrotnej kolejności.
Ponieważ alias nie przechowuje żadnych literalnych wartości, jego wartość pozostaje statyczna, podczas gdy rzeczywiste argumenty mogą się zmieniać, ale nadal będzie odwoływać się do tylu, ile może. Na przykład:
... które drukuje ...
Ale resetowanie aliasu można wykonać w następujący sposób:
... i tak drukuje ...
źródło
źródło
for ((i = $# - 1; i >= 0; i--))