Сценарий оболочки UNIX: использование case для проверки ввода пользователя

Вот команда, которую вы попросили cron выполнить:

/usr/bin/mkdir /qwerty /usr/bin/touch file1

Это вызывает mkdir с параметрами дерева: /qwerty, /usr/bin/touch, и файл1. Таким образом, mkdir попытается создать их в качестве каталогов. Вероятно, вы имели в виду выполнить их как две отдельные команды:

 6 13 * * * /usr/bin/mkdir /qwerty
11 13 * * * /usr/bin/touch /qwerty/file1

Другой стиль сделал бы это как однострочник:

6 13 * * * /usr/bin/mkdir /qwerty && sleep 5m && /usr/bin/touch /qwerty/file1

Обратите внимание, что использование cron для одноразовых заданий странно; как указано в Прокомментируйте ваш вопрос, работа на работе будет иметь больше смысла.

Кроме того, это все равно не удастся, если пользователю не будет разрешено создавать каталоги под /.

1
08.07.2017, 01:53
3 ответа

Чтобы проверить обе переменные одновременно, вы можете объединить и проверить.

Вот та часть, которая меняется:

case $num1$num2 in 
'' |*[!0-9]*)
    echo "please enter a valid number"
    exit
    ;;

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

1
27.01.2020, 23:33

Используя bash, вы можете использовать регулярное выражение для проверки числа:

#! /bin/bash
while [ -z "$REPLY" ]; do
    read -p "Enter a valid number: "
    if ! [[ "$REPLY" =~ ^[0-9]+$ ]] ; then
        echo Bad number: $REPLY
        REPLY=
    fi
done
echo A valid number: $REPLY

Программа продолжает считывать ввод до тех пор, пока переменная $REPLYне будет установлена ​​с помощью read. Когда число совпадает с ^[0-9]+$, цикл завершается.

1
27.01.2020, 23:33

Для этого можно определить пользовательскую функцию.

# func def.
isInt() {
    case ${1-} in '' | *[!0-9]* ) return 1 ;; esac
    return 0
}

# now use it as:
if isInt "$num1"; then
   echo "$num1 is a valid integer"
else
   echo "$num1 is not an integer"
fi

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

0
27.01.2020, 23:33

Теги

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