Не можете Вы просто Ctrl+Alt и затем нажимать клавиши F-x, пока Вы не возвратитесь к GNOME? Это - то, что я делаю.
На моей машине человечности Ctrl+Alt+F7 возвращает меня на мою сессию гнома.
Необходимо использовать declare -A
вместо declare -a
. Вы ясно используете ассоциативные массивы с аргументами произвольной строки как индексы, но declare -a
только для целочисленных индексных массивов. arg.txt
не оценивает к допустимому целому числу, следовательно Ваша ошибка.
Вы, кажется, используете bash
версия 3. К сожалению, ассоциативные массивы не доступны до версии 4. Я рекомендую отправить санированную версию оригинала deploy.sh
сценарий с конфиденциальной личной информацией удалил, таким образом, можно получить идеи от других людей об альтернативных подходах.
Только суммировать немного обмена в чате:
Самый легкий способ сделать некоторое действие по всем аргументам состоит в том, чтобы просто выполнить итерации по ним с a for
цикл:
for arg; do
scp login1@host1:"$arg" login2@host2:/dest/
done
Помните к двойной кавычке все экземпляры "$arg"
. Вы не должны помещать аргументы в массив сами, поскольку они уже существуют в массиве $@
, который является что for
использование по умолчанию, когда Вы не даете явное in list...
.
Та ошибка происходит любое время, Вы пытаетесь использовать строку, где число ожидалось.
Например,
$((input.txt))
заставит ту же ошибку быть распечатанной.
В Вашем случае оказывается, что Вы присваивали массиву, который использует числовой индекс.
jw013 справедливо объясняет, что необходимо сделать declare -A
(верхний регистр A), чтобы Ваш пример работал.
Причина, почему:
При присвоении элементу массива Вы обычно писали бы
array[0]=foo
array[1]=bar
но можно также записать любое арифметическое выражение как ключ, например.
array[0+0]=foo
array[1+0]=bar
таким образом, оболочка видит
array[input.txt]=input.txt
попытка преобразовать его в число как
$((input.txt))
и сбой.
Причина точка сбивает с толку и это аргументы без точки, кажется, работает, это
$((input))
на самом деле верный номер.
bash
видит input
, решает, что это - допустимое имя переменной, видит, что переменная сброшена и заменяет его 0
.
Сравните это с input.txt
, который не является допустимым именем переменной, потому что имена переменной не могут содержать точки!
Для предотвращения этого запутывающего поведения можно использовать
set -u
затем любое время, Вы пытаетесь использовать переменную, которая не существует, Вы получите ошибку, например.
set -u
artifacts[arg1]=arg1
печатает ошибку
scriptname: line number: arg1: unbound variable