Как проверить, является ли введенная переменная буквенно-цифровой или нет в ksh?

Вы не сказали, с каким программным обеспечением ВМ вы работаете, поэтому я оставлю этот ответ очень общим.

Обратите внимание, что есть гораздо более эффективные и чистые методы, но они сильно зависят от решения виртуализации, которое вы используете. Ознакомьтесь с документацией, чтобы узнать о поддерживаемых методах создания образов / клонирования / снимков.


Вы должны создать новый образ диска виртуальной машины, установить и настроить Ubuntu полностью по своему вкусу, но только с теми настройками, которые вам нужны на всех вновь созданных виртуальных машинах.

Например: опустите сетевые настройки, не добавляйте пользователя, если имя пользователя / uid не будет одинаковым каждый раз, когда вы создаете новые виртуальные машины.

После настройки базовой виртуальной машины выключите ее.

На главной рабочей станции, на которой вы создали виртуальную машину, смонтируйте файловые системы из образа диска и обнулите свободное пространство в каждом разделе.

Это будет сделано на хосте Linux:

mnt - это точка монтирования, в которую вы смонтировали разделы образа диска виртуальной машины, что зависит от того, где вы его на самом деле смонтировали.

dd if=/dev/zero of=/mnt/zerofile bs=1M conv=sync
rm -f /mnt/zerofile
umount /mnt

После завершения для каждого раздела изображения вы можете сжать изображение своей любимой утилитой сжатия.

xz -9 /path/to/disk.img

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

1
16.11.2016, 12:11
4 ответа

Некоторая идея, основанная на expr :

if expr "x$string" : '.*[^[:alnum:]]' >/dev/null;
then
  printf "%s is NOT alphanumeric\n" "$string"
else
  printf "%s is alphanumeric\n" "$string"
fi

Обратите внимание, что использование printf вместо echo является преднамеренным, поскольку "$ string" - произвольная строка. Подробнее здесь . Также "x" в начале предотвращает блокировку expr , если $ string расширяется до чего-то, что начинается с - . Я благодарен Стефану и Сато, которые помогли уточнить этот ответ своими комментариями.

1
27.01.2020, 23:34

POSIXLY:

is_alnum() {
  case $1 in (*[![:alnum:]]*|"") false;; esac
}

Затем:

$ is_alnum 123 && echo yes
yes
$ is_alnum % || echo no
no

mksh - единственная оболочка, потерпевшая неудачу при описанном выше подходе.


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

yash работает только с допустимыми символами Юникода, поэтому только он сообщает об ошибке:

$ is_alnum $'A\xe9B'
yash: cannot convert the argument `A�B' into a wide character stringyash: the argument is replaced with an empty string
3
27.01.2020, 23:34

Спасибо за помощь .. после многих попыток я получил это решение, работающее.

var=`echo "some-value" | tr -d "[:alnum:]"`
if [ "$var" == "" ]; then
echo " string has only alphanumerics"
else
echo "something other than alphanumerals  is there"
fi
0
27.01.2020, 23:34

Вы можете:

[[ $var = +([[:alnum:]]) ]]

Это будет работать в реализациях AT&T ksh и zsh ksh , но явно не в на основе pdksh . Это работает в zsh -o kshglob (например, когда zsh вызывается как ksh ) или bash -O extglob .

+ (...) - это ksh подстановочный знак для , одного или нескольких . [[: alnum:]] - это любой символ, который считается буквенно-цифровым в текущей локали (в любом алфавите, не обязательно только в латинском алфавите).

Если вы хотите ограничиться английскими буквами и цифрами, предполагая, что переменная LC_ALL не установлена, вы можете сделать:

LC_COLLATE=C; [[ $var = +([a-zA-Z0-9]) ]]

Если нет:

[[ $var = +([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]) ]]

Это:

LC_ALL=C; [[ $var = +([[:alnum:]]) ]]

Также должно работать даже если он меняет значение символов.Поскольку символы, которые будут содержать байты, которые в противном случае соответствуют alnums ASCII (например, £ в GB18030, который закодирован как 81 30 84 35, где 30 также является ASCII 0), также будут содержать байты, которые не находятся в ASCII (например, 81 84 для £), и все кодировки в данной системе должны согласовывать кодировку символов в переносимой кодировке, которая включает в себя все английские буквенно-цифровые символы.

Также обратите внимание, что в локали UTF-8, ksh93u + (по крайней мере) в настоящее время имеет ошибку, заключающуюся в том, что if $ var содержит последовательности байтов, которые не образуют допустимые символы, но эти байты соответствуют alnums. в наборе символов ISO-8859-1, тогда они будут рассматриваться как alnums . Например, $ 'A \ xe9B' будет считаться буквенно-цифровым, потому что 0xe9 - это é в ISO-8859-1. (U + 00E9 - это é , но кодировка é в UTF-8 - 0xc3 0xa9, а не 0xe9).

1
27.01.2020, 23:34

Теги

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