Если вы не хотите делать это вручную (например, в synaptic или редактировать sources.list и перейти на одно из зеркал, найденных по адресу https: // www. debian.org/mirror/mirrors_full), насколько мне известно, вам потребуется установить другую программу. netselect-apt
якобы может выбирать самые быстрые / ближайшие зеркала и автоматически обновлять ваш sources.list.
Это похоже на вопрос 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}
не является допустимым именем параметра, поэтому мы получаем неверный замена
. Поэтому мы просто делаем это в два шага, чтобы избежать этой проблемы.
Используя 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]} "
.