например echo -e "\001\033[5m\033[7m\002${var}\001\033[0m\002"
Если переменная начинается с нечислового символа, это работает.
Однако, если var, начинающийся с номера, он терпит неудачу
например вар = 5
тогда строка "\001\033[5m\033[7m\0025\001\033[0m\002"`` по какой-то причине не мигает 5, на экране пустая строка
Для полноты, проблема заключается в том, что var имеет восьмеричную цифру в качестве наиболее значимой цифры - поэтому, если бы var было 8 или 9 (или 81...), она работала бы так, как ожидалось.
Для исторических целей в 2011 году это было идентифицировано как «ошибка bash»: superuser.com/a/301355
Сохраните \002
в var:
oo2=$'\002'
var=5
echo -e "\001\033[5m\033[7m$oo2${var}\001\033[0m\002"
# ^^^^
Хотя, вероятно, есть какой-то способ избежать ведущей цифры в ${var}
, я бы предпочел заменить echo -e
на printf
, например:
printf "\001\033[5m\033[7m\002%s\001\033[0m\002\n" "${var}"
ПРИМЕЧАНИЕ: добавлен \n
в конце, чтобы гарантировать тот же эффект, что и echo
.
Можно также использовать printf '%b%s%b' '\001\033[5m\033[7m\002' "$var" '\001\033[0m\002\n'
, чтобы быть более явным.
Вы можете использовать tput
, чтобы избежать жесткого кодирования и сделать его более читабельным.
blink=$(tput blink)
rev=$(tput rev)
sgr0=$(tput sgr0)
printf "\001%s%s\002%s%s\002\n" "$blink" "$rev" "$var" "$sgr0"
printf
, что позволяет различать%b
для вещей, которые должны учитываться как escape-последовательности, и%s
для вещей, которые должны быть напечатаны точно так, как они есть.