Hogyan kaphatok egy $@
szeletet a Bash-ban anélkül, hogy először másolnunk kellene az összes pozícióparaméter egy másik ilyen tömbhöz?
argv=( "$@" ) echo "${argv[@]:2}";
Megjegyzések
Válasz
Ugyanazt a formátumot használhatja, mint bármely más tömböt. A 2. és 3. elem kibontásához a $@
fájlból a következőket tenné:
echo "${@:1:2}" - - | |----> slice length |------> slice starting index
Megjegyzések
- De úgy tűnik, hogy ez char-by-char alapján működik a v4.1.2-ben, van-e mód arra, hogy ezt szóról szóra megtehessem?
- @AlexejMagura I ne ' ne értsd, mire gondolsz. Ez a tömb elemeire hat. Ha van egy karakterből álló eleme, akkor " működik a " karaktereken. Ha minden elem szó, akkor szavakon működik. Talán ezt egy karakterláncon próbálja meg, és nem egy tömböt?
- I ' m a " $ @ ", amelyről azt gondolom, hogy ezen a ponton karakterlánccá válhat, én ' nem vagyok biztos benne.
- A 4.2.46-os verzión a
"${@:1:2}"
valójában megadja nekem az 1. és a 2. parancssori argumentumokat . Eközben a"${@:1}"
megadja a teljes parancssori argumentumokat , a"${@:0}"
pedig a szkript nevét. amelyet teljes parancssori argumentumok követnek . - @Rockallite is, igen. A
$@
tömb 2. és 3. eleme az 1. és 2. argumentum."${@:1}"
kinyomtatja a teljes tömböt a 2. elemmel (az 1. argumentum) kezdve, a${@:0}
a teljes tömböt az 1. elemtől kezdve, amely a szkript neve. Mire számított?
Válasz
A függvényparamétereknél a egyáltalán nem működött nálam. Azt is szerettem volna az első elem szétválasztására, mivel ez egy másik paraméter volt. Mi működött:
function foo(){ #takes single param + array of params local param1="$1". #first param local -a tmp=( "${@}" ) #copy all params local -a rem_params=( "${tmp[@]:1}") #slice off first:Works! # local -a rem_params=( "${@[@]:1}" ) #DID NOT WORK, ERROR # local -a rem_params=( "{@:1}" ) #DID NOT SLICE echo "${rem_params[@]}" }
Talán azért írok, hogy teszteljem, hogyan működik ez a helyzeti argumentumokkal a szkript szintjén, de jelenleg nincs idő.
Válasz
Általában ezt csinálom:
somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth
amely kinyomtatja:
message = first other = second third goforth
A fogalmat kibővítheti úgy, hogy shift
beírja a második, harmadik stb. argumentumot
"$@"
. Aargv
hozzárendelés megszakad, ha bármelyik argum szóközt tartalmaz.