Хотя другие ответили на ваш конкретный вопрос, я добавлю, что
if [ -n "$(echo $1 | grep '^-[0-9][0-9]*$')" ]; then
Это неправильный способ проверить, соответствует ли строка обычному выражение по нескольким причинам:
echo
для произвольных данных $ 1
выше - это оператор split + glob. grep
сопоставляет регулярное выражение не с полным вводом, а с каждой строкой ввода. Так, например, он вернет истину на foo \ n-0 \ nbar
. grep
какой-либо вывод (обратите внимание, что при подстановке команд удаляются завершающие символы новой строки). Лучше использовать grep -q
и полагаться на статус выхода grep
, а не на [
, а также избегать подстановки команд. grep
может быть упрощена до grep -xE '- [0-9] +'
bash
, ksh93
и zsh
имеет специальный оператор для (расширенного) сопоставления регулярных выражений. Чтобы использовать его портативно и надежно для всех трех (и bash-3.1), синтаксис следующий:
re='^-[0-9]+$'
if [[ $1 =~ $re ]]; then
echo matches
fi
yash
и zsh
также поддерживают:
if [ "$1" '=~' '^-[0-9]+$' ]; then
echo matches
fi
Стандартная команда для сопоставления строковых (базовых) регулярных выражений - expr
:
if expr " $1" : ' -[0-9]\{1,\}$' > /dev/null; then
echo matches
fi
Обратите внимание, что ^
(но не $
) неявно содержится в expr
. Мы также используем этот начальный пробел, чтобы избежать проблем со значениями $ 1
, которые оказываются операторами expr
.
Также обратите внимание, что если регулярное выражение содержит \ (... \)
, это повлияет на поведение expr
.
В общем, лучше использовать awk
, что является другим стандартным / переносимым способом сделать это (обратите внимание, что awk
использует расширенные регулярные выражения):
if STRING=$1 RE='^-[0-9]+$' awk '
BEGIN{exit(ENVIRON["STRING"] !~ ENVIRON["RE"])}'; then
...
Или используйте function:
re_match() {
STRING=$1 RE=$2 awk '
BEGIN{exit(ENVIRON["STRING"] !~ ENVIRON["RE"])}'
}
if re_match "$1" '^-[0-9]+$'
В этом случае вы также можете добиться этого с помощью стандартной конструкции case
:
case $1 in
("" | *[!0-9-]* | [!-]* | - | ?*-*) ;;
(*) echo match;;
esac
Чтобы использовать grep
, вы можете использовать его с - Параметр null
(где поддерживается, поскольку это не стандартный вариант), чтобы указать ему работать с записями с разделителями NUL вместо записей с разделителями новой строки. Поскольку в большинстве оболочек $ 1
не может содержать NUL, это должно быть безопасно:
if printf %s "$1" | grep --null -xq '-[0-9]+$'; then
echo match
fi
Размер физического блока, сообщаемый fdisk
, представляет собой размер физического блока, сообщаемый диском при запросе. Он редко имеет какое-либо отношение к страницам SSD или стираемым блокам.
Чтение / запись 4 КиБ - это общий показатель производительности ввода-вывода, представляющий «небольшие» операции ввода-вывода.
Не существует стандартного способа для SSD сообщать размер своей страницы или размер стираемого блока. Немногие, если какие-либо производители, сообщают о них в таблицах данных. (Потому что они могут измениться в течение срока службы SKU, например, из-за смены поставщиков.) Существует технический документ от Intel , в котором предполагается, что выравнивания 4 КиБ достаточно.
Для практического использования просто выровняйте все свои структуры данных (разделы, полезную нагрузку контейнеров LUKS, логические тома LVM) с границами в 1 или 2 МиБ. В конце концов, это SSD - он предназначен для работы с обычными файловыми системами, такими как NTFS (которая использует 4 единицы распределения KiB). Если Windows считает, что выравнивания разделов до 1 МБ достаточно, вы можете поспорить, что любой производитель SSD позаботится о том, чтобы их продукты хорошо работали с такой конфигурацией.
Лучше всего оставлять от 5% до 10% нераспределенного пространства вне любых разделов. Наличие избыточного пространства очень помогает твердотельным накопителям в сохранении их производительности во времени.
smartctl
(доступный в smartmontools
) должен сделать это за вас.