Хорошее объяснение этого можно найти здесь здесь . Суммировать: число в скобке в int (N) часто путается максимальным размером, разрешенным для столбца, как это имеет место в случае varchar (N). Но это не относится к типам данных Integer - число N в скобках не является максимальным размером для столбца, а просто параметром, указывающим MySQL, какую ширину отображает столбец, когда данные таблицы просматриваются через MySQL console (когда вы используете атрибут ZEROFILL). Число в скобках подскажет MySQL, сколько нулей для ввода входящих целых чисел. Например: если вы используете ZEROFILL в столбце, который установлен в INT (5), а число 78 вставлено, MySQL будет заполнять это значение нулями до тех пор, пока число не удовлетворит число в скобках. т. е. 78 станет 00078 и 127 станет 00127. Подводя итог: число в скобках используется для показа. В некотором смысле, число в скобках является бесполезным, если вы не используете атрибут ZEROFILL. Таким образом, размер для int останется таким же, например, -2147483648 до 2147483648 для подписанных и 0 to 4294967295 для неподписанных (~ 2,15 миллиарда и 4,2 миллиарда долларов), одна из причин, по которым разработчики не знают историю, стоящую за номером N в скобках, поскольку это вряд ли влияет на базу данных, если она содержит более 2 миллиардов строк), а в байтах - 4 байта.
Для получения дополнительной информации о размере / диапазоне типов Integer см. Руководство по MySQL
Я всегда делал его с sed
var=`hg st -R "$path" | sed -e 's/ *$//'`
, Если существует более изящное решение, я надеюсь, что кто-то отправляет его.
Bash имеет функцию, названную расширение параметра , который, среди прочего, позволяет строковую замену на основе так называемого шаблоны (шаблоны напоминают регулярные выражения, но существуют принципиальные различия и ограничения). [исходная строка flussence: Bash имеет регулярные выражения, но они хорошо скрыты:]
следующее демонстрирует, как удалить весь пробел (даже от внутренней части) от значения переменной.
$ var='abc def'
$ echo "$var"
abc def
# Note: flussence's original expression was "${var/ /}", which only replaced the *first* space char., wherever it appeared.
$ echo -n "${var//[[:space:]]/}"
abcdef
Можно удалить новые строки с tr
:
var=`hg st -R "$path" | tr -d '\n'`
if [ -n $var ]; then
echo $var
done
Я видел сценарии просто использовать переменное присвоение, чтобы сделать задание:
$ xyz=`echo -e 'foo \n bar'`
$ echo $xyz
foo bar
Пробел автоматически объединяется и обрезается. Нужно остерегаться метасимволов оболочки (потенциальный инжекционный риск).
я также всегда рекомендовал бы дважды заключающие в кавычки подстановки переменных в условных выражениях оболочки:
if [ -n "$var" ]; then
начиная с чего-то как-o или другое содержание в переменной мог исправить Ваши тестовые аргументы.
Используйте AWK:
echo $var | awk '{gsub(/^ +| +$/,"")}1'
trim()
{
local trimmed="$1"
# Strip leading space.
trimmed="${trimmed## }"
# Strip trailing space.
trimmed="${trimmed%% }"
echo "$trimmed"
}
Например:
test1="$(trim " one leading")"
test2="$(trim "one trailing ")"
test3="$(trim " one leading and one trailing ")"
echo "'$test1', '$test2', '$test3'"
Вывод:
'one leading', 'one trailing', 'one leading and one trailing'
trim()
{
local trimmed="$1"
# Strip leading spaces.
while [[ $trimmed == ' '* ]]; do
trimmed="${trimmed## }"
done
# Strip trailing spaces.
while [[ $trimmed == *' ' ]]; do
trimmed="${trimmed%% }"
done
echo "$trimmed"
}
Например:
test4="$(trim " two leading")"
test5="$(trim "two trailing ")"
test6="$(trim " two leading and two trailing ")"
echo "'$test4', '$test5', '$test6'"
Вывод:
'two leading', 'two trailing', 'two leading and two trailing'
Вы можете использовать старый добрый tr
. Например, это возвращает количество измененных файлов в репозитории git без пробелов.
MYVAR=`git ls-files -m|wc -l|tr -d ' '`
Если в Bash включены расширенные функции сопоставления с образцом ( shopt -s extglob
), вы можете использовать следующее:
{trimmed ## * ()}
, чтобы удалить произвольное количество начальных пробелов .
Определим переменную, содержащую ведущие, концевые и промежуточные пробелы:
FOO=' test test test '
echo -e "FOO='${FOO}'"
# > FOO=' test test test '
echo -e "length(FOO)==${#FOO}"
# > length(FOO)==16
Как удалить все пробелы (обозначенные [:space:]
в tr
):
FOO=' test test test '
FOO_NO_WHITESPACE="$(echo -e "${FOO}" | tr -d '[:space:]')"
echo -e "FOO_NO_WHITESPACE='${FOO_NO_WHITESPACE}'"
# > FOO_NO_WHITESPACE='testtesttest'
echo -e "length(FOO_NO_WHITESPACE)==${#FOO_NO_WHITESPACE}"
# > length(FOO_NO_WHITESPACE)==12
Как удалить только ведущие пробелы:
FOO=' test test test '
FOO_NO_LEAD_SPACE="$(echo -e "${FOO}" | sed -e 's/^[[:space:]]*//')"
echo -e "FOO_NO_LEAD_SPACE='${FOO_NO_LEAD_SPACE}'"
# > FOO_NO_LEAD_SPACE='test test test '
echo -e "length(FOO_NO_LEAD_SPACE)==${#FOO_NO_LEAD_SPACE}"
# > length(FOO_NO_LEAD_SPACE)==15
Как удалить только пробелы в конце страницы:
FOO=' test test test '
FOO_NO_TRAIL_SPACE="$(echo -e "${FOO}" | sed -e 's/[[:space:]]*$//')"
echo -e "FOO_NO_TRAIL_SPACE='${FOO_NO_TRAIL_SPACE}'"
# > FOO_NO_TRAIL_SPACE=' test test test'
echo -e "length(FOO_NO_TRAIL_SPACE)==${#FOO_NO_TRAIL_SPACE}"
# > length(FOO_NO_TRAIL_SPACE)==15
Как удалить и ведущие, и концевые пробелы - цепочка sed
s:
FOO=' test test test '
FOO_NO_EXTERNAL_SPACE="$(echo -e "${FOO}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
echo -e "FOO_NO_EXTERNAL_SPACE='${FOO_NO_EXTERNAL_SPACE}'"
# > FOO_NO_EXTERNAL_SPACE='test test test'
echo -e "length(FOO_NO_EXTERNAL_SPACE)==${#FOO_NO_EXTERNAL_SPACE}"
# > length(FOO_NO_EXTERNAL_SPACE)==14
Альтернативно, если ваш bash поддерживает это, вы можете заменить echo -e "${FOO}" | sed ...
на sed ... <<<${FOO}
, примерно так (для пробельных символов в конце):
FOO_NO_TRAIL_SPACE="$(sed -e 's/[[:space:]]*$//' <<<${FOO})"
Существует решение, которое использует только встроенные средства Bash, называемые подстановочными знаками :
var=" abc "
# remove leading whitespace characters
var="${var#"${var%%[![:space:]]*}"}"
# remove trailing whitespace characters
var="${var%"${var##*[![:space:]]}"}"
echo "===$var==="
Вот то же самое, заключенное в функцию:
trim() {
local var="$*"
# remove leading whitespace characters
var="${var#"${var%%[![:space:]]*}"}"
# remove trailing whitespace characters
var="${var%"${var##*[![:space:]]}"}"
echo -n "$var"
}
Вы передаете строку, чтобы обрезаны в цитируемой форме. например:
trim " abc "
В этом решении хорошо то, что оно будет работать с любой POSIX-совместимой оболочкой.