LINUX.ORG.RU

обращение к n-ому аргументу через переменную

 ,


1

1

у меня есть скрипт, который получает на вход несколько аргументов, мне нужно обработать их начиная с n-ого. обрабатываю я их через for ((i=n; i<$#; i++)). могу ли я напрямую через значение i обратиться в n-ому аргументу? никакой из опробованных мною вариантов не сработал. по итогу-то пихнул все аргументы в массив и обращался через массив, но этот вопрос не дает мне покоя


Очень странное желание. Скорее всего ты что-то делаешь не так, и надо исправлять глобальную логику работы твоей системы.

firkax ★★★★★
()
Ответ на: комментарий от astnt

но могу ли я сделать что-то вроде echo ${$n} ?

Оно?

f()
{
	for ((i=1; i<=$#; i++)) ; do
		echo "=> ${!i}"
	done
}

f Привет ЛОР
$ bash 1.sh 
=> Привет
=> ЛОР
wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)

Завести в массив (как описал @Anoxemian), и обращаться к элементу массива.

Но поддержу сказанное выше: ты делаешь что-то не так. Если тебе по очереди нужно проработать все аргументы, то делай while (ещё есть аргументы), бери $1, а затем shift.

Kroz ★★★★★
()

я напрямую через значение i обратиться в n-ому аргументу?

Ты специально так пишешь, чтобы никто не догадался что тебе надо? Если ты «через значение i» хочешь обратиться к элементу, то почему элемент n-ный, а не i-тый?

debugger ★★★★★
()
Ответ на: комментарий от targitaj

If the first character of parameter is an exclamation point (!), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion. The value is subject to tilde expansion, parameter expansion, command substitution, and arithmetic expansion. If parameter is a nameref, this expands to the name of the variable referenced by parameter instead of performing the complete indirect expansion. The exceptions to this are the expansions of ${!prefix*} and ${!name[@]} described below. The exclamation point must immediately follow the left brace in order to introduce indirection.

wandrien ★★
()

В тегах стоит bash, но это не помешает мне похвастаться. В rc это делается изичным стандартным для всех массивов механизмом:

fn userfunc {
	i = $1
	echo $*($i)
}

userfunc 3 lol kek foo bar

Никаких промежуточных переменных, срезов или ссылок.

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 2)