Отвечая на последнюю часть вашего вопроса: ваш подход (использование одних и тех же случайных данных три раза) лучше, чем использование нулей.
Не совсем, это почти то же самое. Каждый блок на вашем устройстве, состоящий из трех одинаковых случайных частей, является частью тройки одинаковых блоков. Таким образом, злоумышленник может отобразить блоки вашего устройства, которые изменились, и это та же информация, которую злоумышленник получает с обнуленного устройства. Это ломается только тогда, когда ваше устройство настолько заполнено, что в каждой тройке есть три разных блока.
Если ваш /bin/sh на самом деле является /bin/bash, вы можете использовать косвенную переменную:
#!/bin/bash
STRS=" KW0 KW1 "
KW0_TEXT="text text text"
KW1_TEXT="text text text text"
for str in ${STRS}; do
var=${str}_TEXT
printf "%s\n" "${!var}"
done
Если ваш /bin/sh на самом деле является /bin/bash и ваша версия достаточно свежая, вы можете использовать ассоциативный массив
#!/bin/bash
strs=( KW0 KW1 )
declare -A text=(
[KW0]="text text text"
[KW1]="text text text text"
)
for str in "${strs[@]}"; do
printf "%s\t%s\n" "$str" "${text[$str]}"
done
KW0 text text text
KW1 text text text text
Проблема в том, что вам не хватает литерала $
в вашем использовании eval
. После замены переменной оцениваемая команда будет
echo KW0_TEXT
но ты хочешь
echo $KW0_TEXT
Так и должно быть:
eval echo '$'${str}_TEXT
Однако метод косвенных переменных Джеффа Шаллера предпочтительнее, если вы используете оболочку, которая его поддерживает.