Различать 2 и 02 в скрипте bash - PullRequest
2 голосов
/ 09 февраля 2011

У меня есть скрипт bash, который принимает дату, месяц и год в качестве отдельных аргументов.Используя это, создается URL, который затем использует wget для извлечения контента и сохранения его в html-файле (скажем, t.html).Теперь пользователь может ввести двузначный месяц / дату (как в 02 вместо просто 2 и наоборот).Как мне различить два вышеупомянутых формата и исправить это внутри скрипта?

URL работает следующим образом:
Дата : требуется ввод из 2 цифр.Таким образом, 7 должно быть предоставлено как 07 для правильного построения URL.Здесь я ищу проверку, которая добавила бы ноль к дате, если она меньше 10 и еще не имеет нуля впереди.Таким образом, 7 должно стать 07 для поля даты перед построением URL.
Месяц : требуется ввод из 2 цифр, но здесь URL автоматически добавляет 0 в случае месяца <10. Итак,если пользователь вводит 2, то URL формирует 02, но если пользователь вводит 02, URL формирует 002. Здесь, 0, возможно, потребуется добавить или удалить.</p>

PS: я знаю этот метод, за которым следуют URL s * c & s, но мне просто нужно поработать с ним.

Спасибо,
Шрирам

Ответы [ 3 ]

6 голосов
/ 09 февраля 2011

Немного неясно, о чем ты просишь. Если вы хотите убрать только один начальный ноль, то это будет делать:

month=${month#0}

Это превратит 02 в 2, а 12 останется 12.

Если вам нужно удалить более одного нуля (значение выше 002 превратится в 02), вам нужно будет сделать что-то другое, например, использовать регулярные выражения

while [ -z "${month##0*}" ]; do month=${month#0}; done

или используйте регулярные выражения, как с sed

month=$(sed -e 's/^0*//'<<<"$month")

НТН

EDIT
Согласно вашему редактированию; как уже было предложено, используйте printf

month=$(printf %02d "$month")

это превратит 2 в 02, 12 останется без изменений, как и 123. Если вы хотите ввести двузначное число или у вас нет printf (который является встроенной в bash оболочкой и обычно также доступен в других случаях, так что шансы довольно малы), sed может помочь снова

month=$(sed -e 's/.*\(..\)$/\1/'<<<"00$month")

, который будет предшествовать двум нулям (002) и содержать последние два символа (02), превращая пустую строку в 00. Это тоже превратит a в 0a. Если подумать, вам не нужно sed для этого

month="00$month"
month="${month:0-2}"

(0- требуется для устранения неоднозначности при расширении значения по умолчанию)

2 голосов
/ 09 февраля 2011

Чтобы убрать все начальные нули, независимо от числа и независимо от количества последних цифр (например, фиксируется «010»):

shopt -s extglob
month=009
month=${month##+(0)}
echo "$month"

Демо-версия:

$ for a in 2 02 002 0002 20 020 00200; do echo ${a##+(0)}; done
2
2
2
2
20
20
200

Чтобы исправить любую дату:

shopt -s extglob
fixdigits () {
    if (( ${#1} > 2 || ${#1} < 1 ))
    then
        echo "Invalid number of digits"
        return 1
    fi
    printf '%.2d\n' 0${1##+(0)}
}

Демо-версия:

$ for a in 2 02 002 0002 20 020 00200; do fixdigits $a; done
02
02
Invalid number of digits
Invalid number of digits
02
Invalid number of digits
Invalid number of digits

В качестве альтернативы:

shopt -s extglob
fixdigits () {
    digits=${1##+(0)}
    if (( ${#digits} > 2 || ${#digits} < 1 ))
    then
        echo "Invalid number of digits"
        return 1
    fi
    printf '%.2s\n' 0$digits
}

Демо-версия:

$ for a in 2 02 002 0002 20 020 00200; do fixdigits $a; done
02
02
02
02
02
02
Invalid number of digits
2 голосов
/ 09 февраля 2011

Просто используйте printf.

Например, $(printf "%02d" $day) для добавления начального нуля в случае.
И $(printf "%1d" $month) чтобы убрать ноль в случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...