bash - используйте значение переменной int для ссылки на параметр позиции в функции

Если вы не хотите делать это вручную (например, в synaptic или редактировать sources.list и перейти на одно из зеркал, найденных по адресу https: // www. debian.org/mirror/mirrors_full), насколько мне известно, вам потребуется установить другую программу. netselect-apt якобы может выбирать самые быстрые / ближайшие зеркала и автоматически обновлять ваш sources.list.

2
29.02.2016, 22:47
2 ответа

Это похоже на вопрос SO здесь , который аналогичен комментарию @costas. Вы можете использовать $ # , чтобы получить количество аргументов, а затем косвенные ссылки , например $ {! I} , чтобы получить доступ к переменной по имени. Вот пример:

f() {
    for((i=1; i<=$#; i++)); do
        printf "%d %s\n" "$i" "${!i}"
    done
}

f a b c

, который печатает:

1 a
2 b
3 c

Теперь, когда вы видите, что вы хотите передать имена переменных в качестве позиционных аргументов, вы можете добавить дополнительный уровень косвенной ссылки, например:

a=first
b=second
c=third

f() {
    for((i=1; i<=$#; i++)); do
        var="${!i}"
        printf "%d %s\n" "$i" "${!var}"
    done
}

f a b c

который печатает

1 first
2 second
3 third

This позволяет нам рассматривать каждый аргумент как имя переменной, которое мы храним здесь в var . Затем мы обращаемся к этой переменной косвенно в printf .

Вы получаете только один уровень косвенного обращения за раз, вложение не работает. Поэтому попытка сделать это одним махом, поскольку $ {! $ {! I}} не работает, потому что первый { запускает расширение, а остальные рассматриваются как ПАРАМЕТР значение, которое нужно раскрыть.Первый персонаж - ! остальное будет рассматриваться как имя ПАРАМЕТРА, содержащего имя нужного нам параметра, но $ {! I} не является допустимым именем параметра, поэтому мы получаем неверный замена . Поэтому мы просто делаем это в два шага, чтобы избежать этой проблемы.

5
27.01.2020, 21:56

Используя shift , вы можете сделать следующее:

num_args="$#"

for (( i = 1; i <= "$num_args"; i++ )); do
    echo "$1"
    shift
done

Здесь команда shift сдвигает каждый следующий аргумент из аргументов, переданных в сценарий, на значение $ 1 .

Например:

$ ./myscript one two three four five six
one
two
three
four
five
six

, при этом при первом запуске цикла $ 1 = "один" , затем во втором запуске цикла $ 1 = "два" , поэтому вперед, до последнего аргумента.


Изменить: Если вы хотите получить доступ к любому из аргументов вашего скрипта без порядка, например. используя 2-й и 4-й аргументы одновременно, один метод использует массивы bash следующим образом:

# Initialize the array 'myargs' with all script arguments
myargs=( "$@" )

for (( i = 0; i < "$#"; i++ )); do
    echo "${myargs[$i]}"
done

Здесь вы можете получить доступ к любому из ваших аргументов с любым указанным индексом i , используя форму "$ {myargs [$ i]} ".

2
27.01.2020, 21:56

Теги

Похожие вопросы