Можно ли использовать косвенное расширение bash для строки вместо создания временной переменной?

macOS может кодировать имена файлов в UTF16 на HFSplus, и это означает, что вам не повезло, поскольку в Linux нет локалей UTF16. По сути, ваш язык — UTF8, и он не показывает определенные символы, есть большая вероятность, что это символы UTF16.

Мне вас жаль.

0
30.07.2019, 14:47
3 ответа

Существует множество способов установить переменную (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}}\""
3
28.01.2020, 02:14

Вы можете использовать brace expansionдля создания имен переменных:

for i in {alpha,bravo,charlie}_{date,hash,url,path,status}; do
  echo "$i is ${!i}"
done
2
28.01.2020, 02:14

Если вместо этого использовать 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
1
28.01.2020, 02:14

Теги

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