macOS может кодировать имена файлов в UTF16 на HFSplus, и это означает, что вам не повезло, поскольку в Linux нет локалей UTF16. По сути, ваш язык — UTF8, и он не показывает определенные символы, есть большая вероятность, что это символы UTF16.
Мне вас жаль.
Существует множество способов установить переменную (read "$a$b"
, printf -v "$a$b"...
, declare "$a$b"=...
и т. д. ).
Если вы хотите прочитать значение, это можно сделать, если конечное значение является числом, используя арифметическое расширение, поскольку арифметическое расширение может быть вложенным (, но также см. Последствия для безопасности использования несанитизированных данных в Shell Арифметическая оценка):
$ a=a b=cd acd=10
$ echo $(($a$b))
10
Как правило, bash не поддерживает вложенную замену.
Конечно, ваш игрушечный пример можно несколько сымитировать:
for prefix in alpha bravo charlie; do
for suffix in date hash url path status; do
declare -p "${prefix}_${suffix}"
done
done
Или вы можете поиграть сeval
:
eval "echo \"${prefix}_${suffix} is \${${prefix}_${suffix}}\""
Вы можете использовать brace expansion
для создания имен переменных:
for i in {alpha,bravo,charlie}_{date,hash,url,path,status}; do
echo "$i is ${!i}"
done
Если вместо этого использовать ksh93
, вы можете сделать:
data=(
[alpha]=(
[date]=1563980822
[hash]=bfc1a9ad
[url]=http://example.com/bfc1a9ad
[path]=/build/alpha
[status]=failure
)
[bravo]=(
[date]=1563981822
[hash]=f76025c5
[url]=http://example.com/f76025c5
[path]=/build/alpha2
[status]=success
)
[charlie]=(
[date]=1563982822
[hash]=289f55fd
[url]=http://example.com/289f55fd
[path]=/build/charlie
[status]=success
)
)
for prefix in alpha bravo charlie; do
for suffix in date hash url path status; do
printf '%s\n' "$prefix, $suffix, ${data[$prefix][$suffix]}"
done
done