LINUX.ORG.RU
решено ФорумAdmin

Удаление непечатаемых символов из переменной в bash

 ,


1

2

Задача: создать переменную из кириллицы рандомной длины. Далее эта переменная будет использована в качестве поля CN в subject.

Не придумал ничего лучше:

subj_gen=$( cat /dev/urandom | grep -aoe [абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ] | tr -d '\n' | head -c $( shuf -i 1-10 -n1 ) ); subj_value="CN=$subj_gen"; echo $subj_value

Т.е. создаю массив из кириллицы, из которого выбираю некоторое количество символов, удаляя пробелы между ними.

На выходе получаю:

root@root:~# subj_gen=$( cat /dev/urandom | grep -aoe [абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ] | tr -d '\n' | head -c $( shuf -i 1-10 -n1 ) ); subj_value="CN=$subj_gen"; echo $subj_value

CN=фвЯПШ

root@root:~#

root@root:~# subj_gen=$( cat /dev/urandom | grep -aoe [абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ] | tr -d '\n' | head -c $( shuf -i 1-10 -n1 ) ); subj_value="CN=$subj_gen"; echo $subj_value

CN=Обэ▒

root@root:~#
root@root:~# cat $subj_value

cat: 'CN=Обэ'$'\320': No such file or directory

root@root:~#

Как видим, в первом случае мы получаем корректную переменную, во втором же в конец этой переменной добавляется непечатаемый символ. Если верить cat – это символ $.

Хотелось бы понять, почему данный специальный символ появляется и как его удалить из переменной.

Перемещено hobbit из general


Мимо проходил:

$ CN=$(python -c "import random; print(''.join(random.choices('абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', k=10)));")
$ echo $CN
ргппоАыбзБ
vvn_black ★★★★★
()
Ответ на: комментарий от Anoxemian
:~# time ./test.sh 
ИЯОзцэКцдж

real    0m0.006s
user    0m0.003s
sys     0m0.003s
:~# time python3 -c "import random; print(''.join(random.choices('абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', k=10)));"
ПтэБЖкбЯэЫ

real    0m0.038s
user    0m0.035s
sys     0m0.011s

Ожидаемо.

Anoxemian ★★★★★
()