Удостоверьтесь, что международная переменная является 2 цифрами долго, еще добавьте 0 впереди для создания ее 2 цифрами долго

Как я проверяю международную переменную ($inputNo), чтобы видеть, являются ли это 2 или больше десятичных цифры долго?

Пример:

inputNo="5"

Должен быть изменен на: 05

inputNo="102"

Должен быть оставлен в покое: 102

Я думал об использовании wc и if операторы, но wc -m не делает, кажется, дает фактические символы, переданные в wc, как wc всегда, кажется, дает +1 символам, который дан.

Но я не знаю, как добавить 0 перед текущим входным числом.

16
задан unwind 16 December 2009 в 13:48
поделиться

3 ответа

Вы можете использовать bash-builtin printf с параметром -v , чтобы записать его в переменную, а не выводить на стандартный вывод. :

pax> inputNo=5   ; printf -v inputNo "%02d" $inputNo ; echo $inputNo
05
pax> inputNo=102 ; printf -v inputNo "%02d" $inputNo ; echo $inputNo
102

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

while [[ ${#inputNo} -lt 2 ]] ; do
    inputNo="0${inputNo}"
done

, который по сути представляет собой цикл while , который ставит перед вашей строкой префикс "0 "до тех пор, пока длина не станет больше или равна двум.

Обратите внимание, что это также можно сделать в bash , поставив перед числом два нуля, а затем просто получив два последних символа этой строки, сначала проверяя, что это еще не желаемый размер:

if [[ ${#inputNo} -lt 2 ]] ; then
    inputNo="00${inputNo}"
    inputNo="${inputNo: -2}"
fi

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


Если вы используя оболочку , отличную от , кроме bash (маловероятно, исходя из ваших тегов), вам нужно будет найти эквиваленты или вернуться к использованию внешних процессов для выполнения работы, например:

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do
    inputNo="0${inputNo}"
done

Это в основном то, о чем вы думали в своем вопросе, но обратите внимание на использование -n в команде echo для предотвращения завершения новой строки (что почти наверняка вызывало отключение по одной ошибке).

Но, как было сказано, это резервная позиция. Если вы используете bash , мои предыдущие предложения, вероятно, будут лучшими.

s еще не по крайней мере желаемого размера:

if [[ ${#inputNo} -lt 2 ]] ; then
    inputNo="00${inputNo}"
    inputNo="${inputNo: -2}"
fi

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


Если вы используете оболочку кроме кроме bash (маловероятно, исходя из ваших тегов), вам нужно будет найти эквиваленты или вернуться к использованию внешних процессов для выполнения работы, например:

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do
    inputNo="0${inputNo}"
done

Это в основном то, о чем вы думали в своем вопросе, но обратите внимание на использование -n в команде echo , чтобы предотвратить завершающуюся новую строку (что почти наверняка вызывало у вас отключение одна ошибка).

Но, как было сказано, это запасной вариант. Если вы используете bash , мои предыдущие предложения, вероятно, будут лучшими.

s еще не по крайней мере желаемого размера:

if [[ ${#inputNo} -lt 2 ]] ; then
    inputNo="00${inputNo}"
    inputNo="${inputNo: -2}"
fi

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


Если вы используете оболочку кроме кроме bash (маловероятно, исходя из ваших тегов), вам нужно будет найти эквиваленты или вернуться к использованию внешних процессов для выполнения работы, например:

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do
    inputNo="0${inputNo}"
done

Это в основном то, о чем вы думали в своем вопросе, но обратите внимание на использование -n в команде echo , чтобы предотвратить завершающуюся новую строку (что почти наверняка вызывало у вас отключение одна ошибка).

Но, как было сказано, это запасной вариант. Если вы используете bash , мои предыдущие предложения, вероятно, будут лучшими.

if [[ ${#inputNo} -lt 2 ]] ; then
    inputNo="00${inputNo}"
    inputNo="${inputNo: -2}"
fi

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


Если вы используете оболочку other , чем bash (маловероятно, исходя из ваших тегов), вам нужно будет найти эквиваленты или вернуться к использованию внешних процессов для выполнения работы, например:

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do
    inputNo="0${inputNo}"
done

Это в основном то, о чем вы думали. на ваш вопрос, но обратите внимание на использование -n в команде echo , чтобы предотвратить завершающуюся новую строку (что почти наверняка вызывало вашу постепенную ошибку).

Но, как уже говорилось, это резервная позиция. Если вы используете bash , мои предыдущие предложения, вероятно, будут лучшими.

if [[ ${#inputNo} -lt 2 ]] ; then
    inputNo="00${inputNo}"
    inputNo="${inputNo: -2}"
fi

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


Если вы используете оболочку other , чем bash (маловероятно, исходя из ваших тегов), вам нужно будет найти эквиваленты или вернуться к использованию внешних процессов для выполнения работы, например:

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do
    inputNo="0${inputNo}"
done

Это в основном то, о чем вы думали. на ваш вопрос, но обратите внимание на использование -n в команде echo , чтобы предотвратить завершающуюся новую строку (что почти наверняка вызывало вашу постепенную ошибку).

Но, как уже говорилось, это резервная позиция. Если вы используете bash , мои предыдущие предложения, вероятно, будут лучшими.

Если используется оболочка , отличная от , кроме bash (маловероятно, исходя из ваших тегов), вам нужно будет найти эквиваленты или вернуться к использованию внешних процессов для выполнения работы, например :

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do
    inputNo="0${inputNo}"
done

Это в основном то, о чем вы думали в своем вопросе, но обратите внимание на использование -n в команде echo , чтобы предотвратить завершающуюся новую строку (что почти наверняка вызывало у вас единичная ошибка).

Но, как было сказано, это запасной вариант. Если вы используете bash , мои предыдущие предложения, вероятно, будут лучшими.

если используется оболочка , отличная от , кроме bash (маловероятно, исходя из ваших тегов), вам нужно будет найти эквиваленты или вернуться к использованию внешних процессов для выполнения работы, например :

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do
    inputNo="0${inputNo}"
done

Это в основном то, о чем вы думали в своем вопросе, но обратите внимание на использование -n в команде echo , чтобы предотвратить завершающуюся новую строку (что почти наверняка вызывало у вас (одна ошибка один за другим).

Но, как уже говорилось, это резервная позиция. Если вы используете bash , мои предыдущие предложения, вероятно, будут лучшими.

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do
    inputNo="0${inputNo}"
done

Это в основном то, о чем вы думали в своем вопросе, но обратите внимание на использование -n в команде echo , чтобы предотвратить завершающуюся новую строку (что почти наверняка вызывало отключение по одной ошибке).

Но, как было сказано, это резервная позиция. Если вы используете bash , мои предыдущие предложения, вероятно, будут лучшими.

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do
    inputNo="0${inputNo}"
done

Это в основном то, о чем вы думали в своем вопросе, но обратите внимание на использование -n в команде echo для предотвращения завершения новой строки (что почти наверняка вызывало отключение по одной ошибке).

Но, как было сказано, это резервная позиция. Если вы используете bash , мои предыдущие предложения, вероятно, будут лучшими.

33
ответ дан 30 November 2019 в 16:19
поделиться

Для заполнения общего назначения, независимо от того, является ли строка числовой или нет

Нет необходимости передавать эхо в wc или использовать while loop.

В Bash вы можете получить длину строки следующим образом: $ {# inputNo} .

И поскольку вы можете использовать подстроки, вы можете сделать это вместо :

if [[ ${#input} < 2 ]] 
then
    inputNo="00${inputNo}"
    inputNo="${inputNo: -2}"
fi
7
ответ дан 30 November 2019 в 16:19
поделиться

Вы можете использовать http://bash-hackers.org/wiki/doku.php/commands/builtin/printf , пример оттуда:

the_mac="0:13:ce:7:7a:ad"

# lowercase hex digits
the_mac="$(printf "%02x:%02x:%02x:%02x:%02x:%02x" 0x${the_mac//:/ 0x})"

# or the uppercase-digits variant
the_mac="$(printf "%02X:%02X:%02X:%02X:%02X:%02X" 0x${the_mac//:/ 0x})"
1
ответ дан 30 November 2019 в 16:19
поделиться