Tylko dla bashu odpowiedź Kevina Little'a proponuje proste ${!#}. Przetestuj za pomocą bash -c 'echo ${!#}' arg1 arg2 arg3. Dla bash , ksh i zsh , w odpowiedzi Dennis Williamsona proponuje ${@: -1}. Ponadto ${*: -1}można również użyć. Przetestuj za pomocą zsh -c 'echo ${*: -1}' arg1 arg2 arg3. Ale to nie działa dla dash , csh i tcsh .
olibre
2
${!#}, w przeciwieństwie do ${@: -1}, działa również z rozszerzaniem parametrów. Możesz to przetestować bash -c 'echo ${!#%.*}' arg1.out arg2.out arg3.out.
Arch Stanton,
Odpowiedzi:
177
To jest trochę włamania:
for last;do true;done
echo $last
Ten jest również dość przenośny (znowu powinien działać z bash, ksh i sh) i nie zmienia argumentów, co może być miłe.
Wykorzystuje fakt, że forniejawnie zapętla się nad argumentami, jeśli nie powiesz, co należy zapętlić, oraz fakt, że w przypadku zmiennych pętli nie ma zasięgu: zachowują ostatnią wartość, dla której zostały ustawione.
W starym Solarisie, ze starą powłoką Bourne'a (nie POSIX), muszę napisać „na koniec w” $ @ ”; do true; done”
mcoolive
8
@mcoolive @LaurenceGolsalves, oprócz tego, for last in "$@"; do :; doneże jest bardziej przenośny, sprawia, że intencja jest znacznie bardziej przejrzysta.
Adrian Günter,
1
@mcoolive: działa nawet w powłoce bourne unix v7 od 1979 roku. Nie można uzyskać większej przenośności, jeśli działa zarówno na v7 sh, jak i POSIX sh :)
Dla tych (jak ja) zastanawiających się, dlaczego potrzebna jest przestrzeń, bash ma do powiedzenia na ten temat:> Zauważ, że ujemne przesunięcie musi być oddzielone od dwukropka co najmniej jedną spacją, aby uniknąć pomylenia z rozszerzeniem: -.
foo
1
Korzystałem z tego i psuje się tylko w MSYS2 bash tylko w systemie Windows. Dziwaczny.
Steven Lu
2
Uwaga: Ta odpowiedź działa dla wszystkich tablic Bash, w przeciwieństwie do tych, ${@:$#}które działają tylko na $@. Jeśli miałbyś kopiować $@do nowej tablicy za pomocą arr=("$@"), ${arr[@]:$#}byłoby niezdefiniowane. Jest tak, ponieważ $@ma 0 element, który nie jest uwzględniony w "$@"rozszerzeniach.
Pan Llama,
@ Mr.Llama: Innym miejscem, którego należy unikać, $#jest iteracja po tablicach, ponieważ w Bash tablice są rzadkie i chociaż $#pokaże liczbę elementów w tablicy, niekoniecznie wskazuje na ostatni element (lub element + 1). Innymi słowy, nie należy robić, for ((i = 0; i++; i < $#)); do something "${array[$i]}"; donea zamiast tego robić for element in "${array[@]}"; do something "$element"; donelub iterować indeksów: for index in "${!array[@]}"; do something "$index" "${array[$index]}"; donejeśli trzeba coś zrobić z wartościami indeksów.
Wstrzymano do odwołania.
80
$ set quick brown fox jumps
$ echo ${*:-1:1}# last argument
jumps
$ echo ${*:-1}# or simply
jumps
$ echo ${*:-2:1}# next to last
fox
Spacja jest niezbędna, aby nie została zinterpretowana jako wartość domyślna .
Najlepsza odpowiedź, ponieważ zawiera również argument przedostatni. Dzięki!
e40
1
Steven, nie wiem, co zrobiłeś, żeby wylądować w Karie, ale uwielbiam twoją pracę tutaj.
Bruno Bronosky
4
tak. po prostu najlepszy. wszystko oprócz polecenia i ostatniego argumentu ${@: 1:$#-1}
Dyno Fu
1
@DynoFu dziękuję za to, odpowiedziałeś na moje następne pytanie. Zmiana może więc wyglądać następująco: echo ${@: -1} ${@: 1:$#-1}gdzie ostatni staje się pierwszy, a reszta zjeżdża w dół
Mike
73
Najprostsza odpowiedź na bash 3.0 lub nowszy to
_last=${!#}# *indirect reference* to the $# variable# or
_last=$BASH_ARGV # official built-in (but takes more typing :)
Otóż to.
$ cat lastarg
#!/bin/bash# echo the last arg given:
_last=${!#}
echo $_last
_last=$BASH_ARGV
echo $_last
for x;do
echo $x
done
$BASH_ARGVnie działa w funkcji bash (chyba że robię coś złego).
Big McLargeHuge,
1
BASH_ARGV ma argumenty, gdy wywołano bash (lub funkcję), a nie obecną listę argumentów pozycyjnych.
Izaak
Zauważ też, co BASH_ARGVda ci wartość, którą podał ostatni argument, zamiast po prostu „ostatniej wartości”. Na przykład !: jeśli podasz jeden argument, a następnie wywołasz shift, ${@:$#}nic nie da (bo zmieniłeś jedyny argument!), Jednak BASH_ARGVnadal da ci ten (poprzednio) ostatni argument.
Chociaż przykład dotyczy funkcji, skrypty działają również w ten sam sposób. Podoba mi się ta odpowiedź, ponieważ jest jasna i zwięzła.
Jonah Braun
1
I nie jest zuchwały. Wykorzystuje wyraźne funkcje języka, a nie efekty uboczne lub specjalne qwerki. To powinna być zaakceptowana odpowiedź.
musicin3d
25
Znaleziono to, gdy chcesz oddzielić ostatni argument od wszystkich poprzednich. Chociaż niektóre odpowiedzi mają ostatni argument, nie są zbyt pomocne, jeśli potrzebujesz wszystkich innych argumentów. Działa to znacznie lepiej:
Odpowiedź Stevena Penny'ego jest nieco ładniejsza: użyj ${@: -1}na ostatni i ${@: -2:1}na drugi ostatni (i tak dalej ...). Przykład: bash -c 'echo ${@: -1}' prog 0 1 2 3 4 5 6wydruki 6. Aby pozostać przy obecnym podejściu AgileZebra, użyj, ${@:$#-1:1}aby uzyskać drugie miejsce . Przykład: bash -c 'echo ${@:$#-1:1}' prog 0 1 2 3 4 5 6wydruki 5. (i ${@:$#-2:1}zdobyć trzeci ostatni i tak dalej ...)
olibre
4
Odpowiedź AgileZebra dostarcza sposobu na uzyskanie wszystkich argumentów oprócz ostatnich, więc nie powiedziałbym, że odpowiedź Stevena ją zastępuje. Jednak wydaje się, że nie ma powodu, aby używać $((...))odejmowania 1, możesz po prostu użyć ${@:1:$# - 1}.
dkasak
Dzięki dkasak. Zaktualizowano, aby odzwierciedlić twoje uproszczenie.
AgileZebra
22
Działa to we wszystkich powłokach zgodnych z POSIX:
Zobacz ten komentarz dołączony do starszej identycznej odpowiedzi.
Wstrzymano do odwołania.
1
Najprostsze przenośne rozwiązanie, jakie tu widzę. Ten nie ma problemu z bezpieczeństwem, @DennisWilliamson, cytowanie wydaje się być wykonane poprawnie, chyba że istnieje sposób na ustawienie $#dowolnego ciągu (nie sądzę). eval last=\"\${$#}\"działa również i jest oczywiście poprawne. Nie rozumiem, dlaczego cytaty nie są potrzebne.
Palec
1
Dla bash , zsh , dash i ksheval last=\"\${$#}\" jest w porządku. Ale do użytku w csh i tcsheval set last=\"\${$#}\" . Zobacz ten przykład: tcsh -c 'eval set last=\"\${$#}\"; echo "$last"' arg1 arg2 arg3.
To świetny pomysł, ale mam kilka sugestii: Najpierw należy dodać cytowanie zarówno wokół, jak "$1"i "$#"(zobacz tę świetną odpowiedź unix.stackexchange.com/a/171347 ). Po drugie, echojest niestety nieprzenośny (szczególnie dla -n), więc printf '%s\n' "$1"należy go użyć.
joki
dzięki @joki Pracowałem z wieloma różnymi systemami uniksowymi i też nie ufałbym echo -n, jednak nie jestem świadomy żadnego systemu posix, który echo "$1"mógłby zawieść. W każdym razie printfjest rzeczywiście bardziej przewidywalny - zaktualizowany.
Michał Šrajer
@ MichałŠrajer rozważ przypadek, w którym „$ 1” to „-n” lub „-”, na przykład ntharg 1 -nlub ntharg 1 --może przynieść różne wyniki w różnych systemach. Kod, który masz teraz, jest bezpieczny!
joki,
10
Od najstarszych do nowszych rozwiązań:
Najbardziej przenośne rozwiązanie, nawet starsze sh(działa ze spacjami i znakami glob) (bez pętli, szybciej):
eval printf "'%s\n'""\"\${$#}\""
Od wersji 2.01 bash
$ set--The quick brown fox jumps over the lazy dog
$ printf '%s\n'"${!#} ${@:(-1)} ${@: -1} ${@:~0} ${!#}"
dog dog dog dog dog
Dla ksh, zsh i bash:
$ printf '%s\n'"${@: -1} ${@:~0}"# the space beetwen `:`# and `-1` is a must.
dog dog
A dla „obok ostatniego”:
$ printf '%s\n'"${@:~1:1}"
lazy
Za pomocą printf można obejść wszelkie problemy z argumentami rozpoczynającymi się od myślnika (np -n.).
Dla wszystkich powłok i starszych sh(działa ze spacjami i znakami glob):
$ set--The quick brown fox jumps over the lazy dog "the * last argument"
$ eval printf "'%s\n'""\"\${$#}\""The last * argument
Lub, jeśli chcesz ustawić lastvar:
$ eval last=\${$#}; printf '%s\n' "$last"The last * argument
shift $(($# - 1))- nie potrzeba zewnętrznego narzędzia. Działa w Bash, ksh, zsh i dash.
Wstrzymano do odwołania.
@Dennis: Fajnie! Nie wiedziałem o $((...))składni.
Laurence Gonsalves,
Chcesz użyć printf '%s\n' "$1", aby uniknąć nieoczekiwanego zachowania echo(np. Dla -n).
joki
2
Jeśli chcesz to zrobić w sposób nieniszczący, jednym ze sposobów jest przekazanie wszystkich argumentów do funkcji i zwrócenie ostatniego:
#!/bin/bash
last(){if[[ $# -ne 0 ]] ; then
shift $(expr $# - 1)
echo "$1"#else#do something when no argumentsfi}
lastvar=$(last "$@")
echo $lastvar
echo "$@"
pax>./qq.sh 123 a b
b
123 a b
Jeśli tak naprawdę cię to nie obchodzi na zachowaniu innych argumentów, nie potrzebujesz ich w funkcji, ale trudno mi myśleć o sytuacji, w której nigdy nie chciałbyś zatrzymać innych argumentów, chyba że zostały już przetworzone, w takim przypadku użyłbym metody process / shift / process / shift / ... sekwencyjnego ich przetwarzania.
Zakładam, że chcesz je zachować, ponieważ nie zastosowałeś metody sekwencyjnej. Ta metoda obsługuje również przypadek, w którym nie ma argumentów, zwracając „”. Możesz łatwo dostosować to zachowanie, wstawiając skomentowaną elseklauzulę.
Wiem, że opublikowałeś to na zawsze, ale to rozwiązanie jest świetne - cieszę się, że ktoś opublikował tcsh!
user3295674,
2
Uważam, że odpowiedź @ AgileZebra (plus komentarz @ starfry) jest najbardziej użyteczna, ale ustawia headssię na skalar. Tablica jest prawdopodobnie bardziej przydatna:
eval dla referencji pośrednich to przesada, nie wspominając o złych praktykach i ogromnym zagrożeniu dla bezpieczeństwa (wartość nie jest cytowana w echu lub poza $ (). Bash ma wbudowaną składnię dla referencji pośrednich, dla dowolnej zmiennej: !Więc last="${!#}"użyłby tego samego podejście (pośrednie odniesienie do $ #) w znacznie bezpieczniejszy, kompaktowy, wbudowany, zdrowy sposób i właściwie cytowane
MestreLion
Zobacz czystszy sposób na wykonanie tego samego w innej odpowiedzi .
Palec
Cytaty @MestreLion nie są potrzebne w RHS =.
Tom Hale
1
@TomHale: prawda dla konkretnego przypadku ${!#}, ale nie ogólnie: cytaty są nadal potrzebne, jeśli treść zawiera dosłowne białe znaki, takie jak last='two words'. Tylko $()białe znaki są bezpieczne bez względu na treść.
MestreLion,
1
Po przeczytaniu powyższych odpowiedzi napisałem skrypt powłoki Q&D (powinien działać na sh i bash), aby uruchomić g ++ na PGM.cpp, aby wygenerować obraz wykonywalny PGM. Zakłada się, że ostatnim argumentem w wierszu poleceń jest nazwa pliku (.cpp jest opcjonalny), a wszystkie pozostałe argumenty są opcjami.
#!/bin/shif[ $# -lt 1 ]then
echo "Usage: `basename $0` [opt] pgm runs g++ to compile pgm[.cpp] into pgm"
exit 2fi
OPT=
PGM=# PGM is the last argument, all others are considered optionsfor F;do OPT="$OPT $PGM"; PGM=$F;done
DIR=`dirname $PGM`
PGM=`basename $PGM .cpp`# put -o first so it can be overridden by -o specified in OPTset-x
g++-o $DIR/$PGM $OPT $DIR/$PGM.cpp
Podejrzewam, że to się nie powiedzie z „ostatnią wartością” ./arguments.sh
Thomas
Dziękuję za sprawdzenie Thomasa, próbowałem wykonać skrypt jako taki jak mentinoed # ./arguments.sh „ostatnia wartość” Ostatni argument: wartość działa teraz poprawnie. # ./arguments.sh „sprawdzenie ostatniej wartości z podwójnym” Ostatni argument to: podwójny
Ranjithkumar T
Problem polega na tym, że ostatnim argumentem była „ostatnia wartość”, a nie wartość. Błąd jest spowodowany argumentem zawierającym spację.
Thomas
0
Jest na to o wiele bardziej zwięzły sposób. Argumenty do skryptu bash można wprowadzić do tablicy, co znacznie upraszcza obsługę elementów. Poniższy skrypt zawsze wypisze ostatni argument przekazany do skryptu.
argArray=("$@")# Add all script arguments to argArray
arrayLength=${#argArray[@]}# Get the length of the array
lastArg=$((arrayLength -1))# Arrays are zero based, so last arg is -1
echo ${argArray[$lastArg]}
Działa to tylko wtedy, gdy ostatni argument nie zawiera spacji.
Palec
Twój prelast kończy się niepowodzeniem, jeśli ostatnim argumentem jest zdanie ujęte w podwójne cudzysłowy, przy czym zdanie to powinno być jednym argumentem.
Stephane
0
Aby zwrócić ostatni argument ostatnio używanej komendy, użyj specjalnego parametru:
$_
W tym przypadku będzie działać, jeśli zostanie użyty w skrypcie przed wywołaniem innego polecenia.
${!#}
. Przetestuj za pomocąbash -c 'echo ${!#}' arg1 arg2 arg3
. Dla bash , ksh i zsh , w odpowiedzi Dennis Williamsona proponuje${@: -1}
. Ponadto${*: -1}
można również użyć. Przetestuj za pomocązsh -c 'echo ${*: -1}' arg1 arg2 arg3
. Ale to nie działa dla dash , csh i tcsh .${!#}
, w przeciwieństwie do${@: -1}
, działa również z rozszerzaniem parametrów. Możesz to przetestowaćbash -c 'echo ${!#%.*}' arg1.out arg2.out arg3.out
.Odpowiedzi:
To jest trochę włamania:
Ten jest również dość przenośny (znowu powinien działać z bash, ksh i sh) i nie zmienia argumentów, co może być miłe.
Wykorzystuje fakt, że
for
niejawnie zapętla się nad argumentami, jeśli nie powiesz, co należy zapętlić, oraz fakt, że w przypadku zmiennych pętli nie ma zasięgu: zachowują ostatnią wartość, dla której zostały ustawione.źródło
true
jest częścią POSIX .for last in "$@"; do :; done
że jest bardziej przenośny, sprawia, że intencja jest znacznie bardziej przejrzysta.To jest tylko Bash:
źródło
${@:$#}
które działają tylko na$@
. Jeśli miałbyś kopiować$@
do nowej tablicy za pomocąarr=("$@")
,${arr[@]:$#}
byłoby niezdefiniowane. Jest tak, ponieważ$@
ma 0 element, który nie jest uwzględniony w"$@"
rozszerzeniach.$#
jest iteracja po tablicach, ponieważ w Bash tablice są rzadkie i chociaż$#
pokaże liczbę elementów w tablicy, niekoniecznie wskazuje na ostatni element (lub element + 1). Innymi słowy, nie należy robić,for ((i = 0; i++; i < $#)); do something "${array[$i]}"; done
a zamiast tego robićfor element in "${array[@]}"; do something "$element"; done
lub iterować indeksów:for index in "${!array[@]}"; do something "$index" "${array[$index]}"; done
jeśli trzeba coś zrobić z wartościami indeksów.Spacja jest niezbędna, aby nie została zinterpretowana jako wartość domyślna .
Zauważ, że jest to tylko bash.
źródło
${@: 1:$#-1}
echo ${@: -1} ${@: 1:$#-1}
gdzie ostatni staje się pierwszy, a reszta zjeżdża w dółNajprostsza odpowiedź na bash 3.0 lub nowszy to
Otóż to.
Dane wyjściowe to:
źródło
$BASH_ARGV
nie działa w funkcji bash (chyba że robię coś złego).BASH_ARGV
da ci wartość, którą podał ostatni argument, zamiast po prostu „ostatniej wartości”. Na przykład !: jeśli podasz jeden argument, a następnie wywołasz shift,${@:$#}
nic nie da (bo zmieniłeś jedyny argument!), JednakBASH_ARGV
nadal da ci ten (poprzednio) ostatni argument.Użyj indeksowania w połączeniu z długością:
Zauważ, że jest to tylko bash.
źródło
echo ${@:$#}
Poniższe będą działać dla Ciebie. @ Oznacza tablicę argumentów. : oznacza o. $ # to długość tablicy argumentów. Wynik jest ostatnim elementem:
Przykład:
Zauważ, że jest to tylko bash.
źródło
Znaleziono to, gdy chcesz oddzielić ostatni argument od wszystkich poprzednich. Chociaż niektóre odpowiedzi mają ostatni argument, nie są zbyt pomocne, jeśli potrzebujesz wszystkich innych argumentów. Działa to znacznie lepiej:
Zauważ, że jest to tylko bash.
źródło
${@: -1}
na ostatni i${@: -2:1}
na drugi ostatni (i tak dalej ...). Przykład:bash -c 'echo ${@: -1}' prog 0 1 2 3 4 5 6
wydruki6
. Aby pozostać przy obecnym podejściu AgileZebra, użyj,${@:$#-1:1}
aby uzyskać drugie miejsce . Przykład:bash -c 'echo ${@:$#-1:1}' prog 0 1 2 3 4 5 6
wydruki5
. (i${@:$#-2:1}
zdobyć trzeci ostatni i tak dalej ...)$((...))
odejmowania 1, możesz po prostu użyć${@:1:$# - 1}
.Działa to we wszystkich powłokach zgodnych z POSIX:
Źródło: http://www.faqs.org/faqs/unix-faq/faq/part2/section-12.html
źródło
$#
dowolnego ciągu (nie sądzę).eval last=\"\${$#}\"
działa również i jest oczywiście poprawne. Nie rozumiem, dlaczego cytaty nie są potrzebne.eval last=\"\${$#}\"
jest w porządku. Ale do użytku w csh i tcsheval set last=\"\${$#}\"
. Zobacz ten przykład:tcsh -c 'eval set last=\"\${$#}\"; echo "$last"' arg1 arg2 arg3
.Oto moje rozwiązanie:
złaeval
Kod:
źródło
"$1"
i"$#"
(zobacz tę świetną odpowiedź unix.stackexchange.com/a/171347 ). Po drugie,echo
jest niestety nieprzenośny (szczególnie dla-n
), więcprintf '%s\n' "$1"
należy go użyć.echo -n
, jednak nie jestem świadomy żadnego systemu posix, któryecho "$1"
mógłby zawieść. W każdym razieprintf
jest rzeczywiście bardziej przewidywalny - zaktualizowany.ntharg 1 -n
lubntharg 1 --
może przynieść różne wyniki w różnych systemach. Kod, który masz teraz, jest bezpieczny!Od najstarszych do nowszych rozwiązań:
Najbardziej przenośne rozwiązanie, nawet starsze
sh
(działa ze spacjami i znakami glob) (bez pętli, szybciej):Od wersji 2.01 bash
Dla ksh, zsh i bash:
A dla „obok ostatniego”:
Za pomocą printf można obejść wszelkie problemy z argumentami rozpoczynającymi się od myślnika (np
-n
.).Dla wszystkich powłok i starszych
sh
(działa ze spacjami i znakami glob):Lub, jeśli chcesz ustawić
last
var:A dla „obok ostatniego”:
źródło
Jeśli używasz Bash> = 3.0
źródło
echo ${BASH_ARGV[1]}
ARGV
oznacza „wektor argumentów”.Dla
bash
, to komentarz sugeruje bardzo elegancki:Jako bonus, działa również w
zsh
.źródło
Powoduje to przesunięcie argumentów o liczbę argumentów pomniejszoną o 1 i zwraca pierwszy (i jedyny) pozostały argument, który będzie ostatnim.
Testowałem tylko w bashu, ale powinien działać również w sh i ksh.
źródło
shift $(($# - 1))
- nie potrzeba zewnętrznego narzędzia. Działa w Bash, ksh, zsh i dash.$((...))
składni.printf '%s\n' "$1"
, aby uniknąć nieoczekiwanego zachowaniaecho
(np. Dla-n
).Jeśli chcesz to zrobić w sposób nieniszczący, jednym ze sposobów jest przekazanie wszystkich argumentów do funkcji i zwrócenie ostatniego:
Jeśli tak naprawdę cię to nie obchodzi na zachowaniu innych argumentów, nie potrzebujesz ich w funkcji, ale trudno mi myśleć o sytuacji, w której nigdy nie chciałbyś zatrzymać innych argumentów, chyba że zostały już przetworzone, w takim przypadku użyłbym metody process / shift / process / shift / ... sekwencyjnego ich przetwarzania.
Zakładam, że chcesz je zachować, ponieważ nie zastosowałeś metody sekwencyjnej. Ta metoda obsługuje również przypadek, w którym nie ma argumentów, zwracając „”. Możesz łatwo dostosować to zachowanie, wstawiając skomentowaną
else
klauzulę.źródło
Dla tcsh:
Jestem pewien, że byłoby to przenośne rozwiązanie, z wyjątkiem zadania.
źródło
Uważam, że odpowiedź @ AgileZebra (plus komentarz @ starfry) jest najbardziej użyteczna, ale ustawia
heads
się na skalar. Tablica jest prawdopodobnie bardziej przydatna:Zauważ, że jest to tylko bash.
źródło
echo "${heads[-1]}"
drukuje ostatni element wheads
. A może coś mi brakuje?Rozwiązanie wykorzystujące
eval
:źródło
!
Więclast="${!#}"
użyłby tego samego podejście (pośrednie odniesienie do $ #) w znacznie bezpieczniejszy, kompaktowy, wbudowany, zdrowy sposób i właściwie cytowane=
.${!#}
, ale nie ogólnie: cytaty są nadal potrzebne, jeśli treść zawiera dosłowne białe znaki, takie jaklast='two words'
. Tylko$()
białe znaki są bezpieczne bez względu na treść.Po przeczytaniu powyższych odpowiedzi napisałem skrypt powłoki Q&D (powinien działać na sh i bash), aby uruchomić g ++ na PGM.cpp, aby wygenerować obraz wykonywalny PGM. Zakłada się, że ostatnim argumentem w wierszu poleceń jest nazwa pliku (.cpp jest opcjonalny), a wszystkie pozostałe argumenty są opcjami.
źródło
Poniższy
LAST
argument ustawi ostatni argument bez zmiany bieżącego środowiska:Jeśli inne argumenty nie są już potrzebne i można je przenieść, można uprościć:
Ze względu na przenośność:
można zastąpić:
Zastępując również
$()
cudzysłowy otrzymujemy:źródło
Teraz muszę tylko dodać tekst, ponieważ moja odpowiedź była zbyt krótka, aby opublikować. Muszę dodać więcej tekstu do edycji.
źródło
$argv
ale nie działa$#argv
-$argv[(count $argv)]
u ryb).To jest część mojej funkcji kopiowania:
Aby użyć w skryptach, wykonaj następujące czynności:
Objaśnienie (najpierw najbardziej zagnieżdżone):
$(echo '$'"$#")
zwraca$[nr]
gdzie[nr]
jest liczba parametrów. Np. Ciąg$123
(nierozwinięty).echo $123
zwraca wartość parametru 123. po oszacowaniu.eval
po prostu rozwija$123
się do wartości parametru, nplast_arg
. Jest to interpretowane jako ciąg znaków i zwracane.Działa z Bash od połowy 2015 roku.
źródło
źródło
Wypróbuj poniższy skrypt, aby znaleźć ostatni argument
Wynik:
Dzięki.
źródło
Jest na to o wiele bardziej zwięzły sposób. Argumenty do skryptu bash można wprowadzić do tablicy, co znacznie upraszcza obsługę elementów. Poniższy skrypt zawsze wypisze ostatni argument przekazany do skryptu.
Próbka wyjściowa
źródło
Korzystanie z rozszerzania parametrów (usuń dopasowany początek):
Łatwo jest też zdobyć wszystko przed ostatnim:
źródło
Aby zwrócić ostatni argument ostatnio używanej komendy, użyj specjalnego parametru:
W tym przypadku będzie działać, jeśli zostanie użyty w skrypcie przed wywołaniem innego polecenia.
źródło
Po prostu użyj
!$
.źródło