Как изменить аргументы команды ($ 1, $ 2) на целые числа?

Если идея использования инструмента на основе Java для достижения этой цели не слишком противна, попробуйте следовать

screenshot of follow utility

1
24.04.2018, 10:43
3 ответа

Внутри [[.. ]]оператор =на самом деле является сопоставлением с шаблоном, поэтому [[ $1 != *[!0-9]* ]]проверяет, не соответствует ли значение $1шаблону *[!0-9]*.

Шаблоны, используемые здесь, такие же, как и для расширения имени файла, поэтому *соответствует любому символу, а [abc]любому символу в квадратных скобках, а [!abc]или [^abc]любому символу , а не . ] в квадратных скобках (, за исключением начального !или^). По сути, это проверяет, содержит ли $1некоторый символ, не являющийся цифрой, от 0до 9.


declare -i varпометит переменную varкак целочисленную переменную, :присвоения ей будут интерпретироваться как в арифметическом контексте, поэтому declare -i a; a=3+5; echo $a;выведет 8. Но вы не можете использовать это для позиционного параметра, например $1. Вместо этого declare -i $1возьмет строку, содержащуюся в $1, и использует , что , в качестве имени переменной. (Обратите внимание, что в declare -i aвыше нет $.)

На самом деле вы не можете использовать declare -iдля проверки того, является ли что-то числом, поскольку строки в арифметическом контексте воспринимаются как имена переменных . Это не ошибка:declare -i a; b=1+2; a=b; echo $a;. Вместо этого он печатает 3, что может быть, а может и не быть тем, что вам нужно.

1
27.01.2020, 23:43

Проверяя, есть ли ввод, а затем, является ли он числовым (из 1 или более цифр ), я использовал этот глобус:

if [ $2 ]; then INPUT=$2 if [[ $INPUT = +([[:digit:]]) ]]; then

Это работает для проверки не -числового ввода:

if [[ -n ${INPUT//[0-9]/} ]]; then

0
27.01.2020, 23:43

Не очень приятное объяснение вроде от ilkkachu

Но можно и так попробовать

[ ! -z $1 -a $1 -eq $1 ] 2>/dev/null && echo "integer $1" || echo "not integer $1"
0
27.01.2020, 23:43

Теги

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