Добавление начальных нулей к пользовательскому вводу, но преобразование с помощью printf

Очевидно, вы добавили /Users/zeinep/.virtualenvs/csv_import/binк вашему $PATHпосле того, как bash сохранил (хешированную )версию /usr/local/bin. Исправление так же просто, как hash -d ipython.

3
12.06.2019, 03:03
2 ответа

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

Вы можете принудительно выполнить десятичное преобразование, используя 10#, например.

$ printf "Please enter the ticket number:\t"; read vTICKET; vTICKET=$(printf %04d "$((10#$vTICKET))" ); printf "$vTICKET\n";
Please enter the ticket number: 072
0072

Обратите внимание, что в bash вы можете присвоить результаты printfпеременной напрямую, используя -v, например.printf -v vTICKET %04d "$((10#$vTICKET))"

См. также Как запретить Bash интерпретировать восьмеричный код вместо целочисленного?

5
27.01.2020, 21:12

В Bash можно избавиться от любых нулей в префиксе. После установки на extglobсначала:

$ shopt -s extglob

Вы можете использовать *(0)после ##в расширении параметра:

$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
000000000000000000000000000000000000072
0072

Когда закончите, вы можете вернуться к обычному режиму с помощьюextglob:

$ shopt -u extglob

Теперь *(0)снова подвергается базовому расширению имени пути:

$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
asdfasdf(0)72
0072
$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
asdfasdf072
bash: printf: asdfasdf072: invalid number
0000
2
27.01.2020, 21:12

Теги

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