Вам нужно протестировать массив, а не (только) элемент 0.
[[ -v array[@] ]]
Это не удается:
$ declare -A array=(["a"]="element 1")
$ declare -p array
declare -A array=([a]="element 1" )
$ [[ -v array ]] && echo yes # nothing is printed.
Но это работает:
$ [[ -v array[@] ]] && echo yes
yes
Итак измените свою функцию на:
function is_var_set {
local avar="${1:?"No var provided to 'is_var_set'!"}[@]"
[[ -v "$avar" ]]
}
Проверьте это с помощью этого сценария:
function is_var_set {
local avar="${1:?"No var provided to 'is_var_set'!"}[@]"
[[ -v "$avar" ]] && echo "$1 set: yes" || echo "$1 set: no"
echo
}
var=wer
echo "array scalar $(declare -p var)"
is_var_set var
var=( foo bar baz )
echo "var indexed array $(declare -p var)"
is_var_set var
unset var
echo "var associative array $(declare -p var)"
is_var_set var
declare -A var=(["a"]="element 1")
echo "var associative array $(declare -p var)"
is_var_set var
Что касается простой маркировки файлов, основной вопрос заключается в том, где/как хранятся метки? Если файловая система не имеет встроенной поддержки тегов разнородных типов файлов, можно найти два распространенных (, хотя и далеких от идеальных )подхода, — это встраивание имен файлов и боковые панели .. Первое означает, что ваши теги фактически вставлены в имя файла, например. foo.txt становится foo -[tag1,tag2].txt . Последний, sidecar, означает, что теги хранятся в файле, расположенном в том же каталоге или общем подкаталоге, что и файл, который нужно пометить. Например, foo.txt может сопровождаться .foo.txt.tags .
Ни один из них не кажется слишком привлекательным, не так ли? Встраивание кажется мне просто уродливым, но, по крайней мере, вам не нужно беспокоиться о том, как сохранить ваши теги с файлом, если вы переместите или удалите его, как в случае с sidecars.
Но очевидно, что эти компромиссы приемлемы для некоторых людей, и есть несколько довольных клиентов таких предложений, как...
Я слышал положительные отзывы об открытом -исходном коде, межплатформенном -решении под названием TagSpaces . По умолчанию используется встроенный подход, но есть версия для Enterpri$e с поддержкой sidecars. Набор функций привлекателен, а пользовательский интерфейс выглядит красиво, а также прост в использовании. Также есть API , если вы хотите интегрироваться с другими клиентами или создавать свои собственные (, например. Командная строка ). И есть кое-что, что следует сказать о кросс-платформенном -аспекте, если вы хотите хранить свои файлы более чем на одной платформе.
Для этого и других подобных решений все сводится к тому, сможете ли вы жить с... давайте посмотрим правде в глаза... довольно хакерские детали сохраняемости тегов!:)
Редактировать:Вот некоторая информация от того, кто использует встроенные теги:Добавление тегов к файлам (PDF-файлы )и обработка из командной строки -или скрипта Остальная часть потока может тоже представлять интерес.
Возможно использование расширенных атрибутов, см. введение в xattr (7 ).
(Но я считаю, что сегодня они широко не используются; в Debian и родственных дистрибутивах вам необходимо установить пакет xattr
, а затем использовать команду xattr
)