Существуют ли какие-либо потенциальные ловушки при использовании символа @ для ключа в ассоциативном массиве в bash?

Я пишу сценарий bash, в котором я автоматизирую создание некоторых основных тестовых входных файлов.

Из-за того, как структурированы данные, в моем сценарии есть часть, где я хотел бы использовать символ @ в некоторых ключах в ассоциативном массиве.

Судя по беглому эхо-тесту, проблем не возникает:

$ declare -A arr
$ arr[1]=hello
$ arr[2]=world
$ arr[@1]=foo
$ arr[@2]=bar
$ for var in "${!arr[@]}"; do echo "key: ${var}, value: ${arr[$var]}" ; done
key: @1, value: foo
key: 1, value: hello
key: @2, value: bar
key: 2, value: world

Но поскольку @ — это специальный символ, мне интересно, назначения клавиш безопасно, а если нет, что я могу сделать, чтобы сделать его более безопасным?


person 3cheesewheel    schedule 18.09.2013    source источник
comment
Если вы не добавите перед ним символ $, как и любой литеральный символ, я думаю, нет. Опасность будет такой же, как и у других персонажей. @ также просто особенный, если используется отдельно, помимо того, что он является еще одним в специальных шаблонах (@()), но я не думаю, что это применимо к присваиванию. Кроме того, при расширении вы можете просто процитировать его. И в большинстве случаев предпочтительнее использовать формат arr["key"]=value.   -  person konsolebox    schedule 18.09.2013
comment
Кроме того, если вы когда-нибудь столкнетесь с какими-либо проблемами при использовании этих специальных символов, вы можете просто заключить их в одинарные кавычки '<chars>', чтобы предотвратить расширение параметра.   -  person Rubens    schedule 18.09.2013
comment
Спасибо всем. Я не знал, что синтаксис в кавычках предпочтительнее; Я сделаю это, чтобы быть в безопасности.   -  person 3cheesewheel    schedule 18.09.2013


Ответы (1)


В разделе bash нет проблем с использованием @ как часть имени ключа для ассоциативного массива.

Bash использует at @ и подчеркивание _ как буквенно-цифровой при преобразовании в base64 в следующем порядке:

0..9 a..z A..Z @ _

$ echo {0..9} {a..z} {A..Z} @ _

Попробуй это:

$ echo $((64#10))
64
$ echo $((64#_))
63
$ echo $((64#@))
62
$ echo $((64#Z))
61
$ echo $((64#A))
36
$ echo $((64#z))
35
$ echo $((64#a))
10

Таким образом, в разделе bash это может быть нормально.

Примечание

Но предупреждаю: если ваш скрипт становится приложением, bash может быть не очень хорошим выбором языка разработки.

person F. Hauri    schedule 18.09.2013