Передача параметра командной строки удара, содержащего точку

Не можете Вы просто Ctrl+Alt и затем нажимать клавиши F-x, пока Вы не возвратитесь к GNOME? Это - то, что я делаю.

На моей машине человечности Ctrl+Alt+F7 возвращает меня на мою сессию гнома.

6
11.05.2012, 18:38
2 ответа

Необходимо использовать declare -A вместо declare -a. Вы ясно используете ассоциативные массивы с аргументами произвольной строки как индексы, но declare -a только для целочисленных индексных массивов. arg.txt не оценивает к допустимому целому числу, следовательно Ваша ошибка.

Править

Вы, кажется, используете bash версия 3. К сожалению, ассоциативные массивы не доступны до версии 4. Я рекомендую отправить санированную версию оригинала deploy.sh сценарий с конфиденциальной личной информацией удалил, таким образом, можно получить идеи от других людей об альтернативных подходах.

Редактирование 2

Только суммировать немного обмена в чате:

Самый легкий способ сделать некоторое действие по всем аргументам состоит в том, чтобы просто выполнить итерации по ним с a for цикл:

    for arg; do
        scp login1@host1:"$arg" login2@host2:/dest/
    done

Помните к двойной кавычке все экземпляры "$arg". Вы не должны помещать аргументы в массив сами, поскольку они уже существуют в массиве $@, который является что for использование по умолчанию, когда Вы не даете явное in list....

10
27.01.2020, 20:22

Та ошибка происходит любое время, Вы пытаетесь использовать строку, где число ожидалось.

Например,

$((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
5
27.01.2020, 20:22

Теги

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