Я придумал базовую, которая поможет автоматизировать процесс удаления ряда папок, когда они становятся ненужными.
#!/bin/bash
rm -rf ~/myfolder1/$1/anotherfolder
rm -rf ~/myfolder2/$1/yetanotherfolder
rm -rf ~/myfolder3/$1/thisisafolder
Это вызывается так:
./myscript.sh <{id-number}>
Проблема в том, что если вы забудете ввести id-number
(как я только что сделал) , то это может потенциально удалить много вещей, которые вы действительно не хотите удалять.
Есть ли способ добавить любую форму проверки к параметрам командной строки? В моем случае было бы хорошо проверить, что: а) есть один параметр, б) он числовой и в) эта папка существует; прежде чем продолжить сценарий.
источник
sh
Решение поBrian Campbell
, в то время как благородный и хорошо выполнены, есть несколько проблем, поэтому я думал , что обеспечить свое собственноеbash
решение.Проблемы с
sh
одним:~/foo
не распространяется на ваш домашний каталог внутри heredocs. И ни когда это читается вread
заявлении или цитируется вrm
заявлении. Значит, вы получитеNo such file or directory
ошибки.grep
и тому подобное для основных операций - это глупо. Особенно, когда вы используете дрянную оболочку, чтобы избежать "тяжелого" веса bash.echo
.sh
может с ними справиться - вот почему я почти всегда предпочитаюbash
, он гораздо более пуленепробиваемый и труднее использовать при правильном использовании).Хотя да, использование
/bin/sh
для вашего хэшбэга означает, что вы должны избегатьbash
измов любой ценой, вы можете использовать всеbash
измы, которые вам нравятся, даже на Ubuntu или еще где-то еще, когда вы честны и ставите#!/bin/bash
на первое место.Итак, вот
bash
решение, которое меньше, чище, прозрачнее, возможно, «быстрее» и более пуленепробиваемое.[[ -d $1 && $1 != *[^0-9]* ]] || { echo "Invalid input." >&2; exit 1; } rm -rf ~/foo/"$1"/bar ...
$1
вrm
заявлении!-d
Проверка также потерпит неудачу , если$1
пусто, так что две проверки в одном.=~
bash, вы должны поместить регулярное выражение в переменную. В любом случае глобусы вроде моей всегда предпочтительнее и поддерживаются в гораздо большем количестве версий bash.источник
$1 != *[^0-9]*
тогда специфическим bash?Я бы использовал bash
[[
:if [[ ! ("$#" == 1 && $1 =~ ^[0-9]+$ && -d $1) ]]; then echo 'Please pass a number that corresponds to a directory' exit 1 fi
Я нашел этот часто задаваемый вопрос хорошим источником информации.
источник
Не такой пуленепробиваемый, как приведенный выше ответ, но все же эффективный:
#!/bin/bash if [ "$1" = "" ] then echo "Usage: $0 <id number to be cleaned up>" exit fi # rm commands go here
источник
Использование,
set -u
которое приведет к тому, что любая неустановленная ссылка на аргумент немедленно приведет к сбою сценария.См. Статью: Написание надежных сценариев оболочки Bash - David Pashley.com .
источник
На странице руководства для test (
man test
) представлены все доступные операторы, которые вы можете использовать как логические операторы в bash. Используйте эти флаги в начале вашего скрипта (или функций) для проверки ввода, как и на любом другом языке программирования. Например:if [ -z $1 ] ; then echo "First parameter needed!" && exit 1; fi if [ -z $2 ] ; then echo "Second parameter needed!" && exit 2; fi
источник
Используйте '-z' для проверки наличия пустых строк и '-d' для проверки каталогов.
if [[ -z "$@" ]]; then echo >&2 "You must supply an argument!" exit 1 elif [[ ! -d "$@" ]]; then echo >&2 "$@ is not a valid directory!" exit 1 fi
источник
Вы можете компактно проверить точки a и b, выполнив следующие действия:
#!/bin/sh MYVAL=$(echo ${1} | awk '/^[0-9]+$/') MYVAL=${MYVAL:?"Usage - testparms <number>"} echo ${MYVAL}
Что дает нам ...
Этот метод должен нормально работать в sh.
источник
однострочная проверка аргумента Bash с проверкой каталога и без нее
Вот несколько методов, которые у меня сработали. Вы можете использовать их либо в глобальном пространстве имен скрипта (если в глобальном пространстве имен, вы не можете ссылаться на встроенные переменные функции)
быстрый и грязный лайнер
: ${1?' You forgot to supply a directory name'}
выход:
Fancier - имя и использование функции поставки
${1? ERROR Function: ${FUNCNAME[0]}() Usage: " ${FUNCNAME[0]} directory_name"}
выход:
Добавьте сложную логику проверки, не загромождая вашу текущую функцию
Добавьте следующую строку в функцию или сценарий, который получает аргумент.
: ${1?'forgot to supply a directory name'} && validate $1 || die 'Please supply a valid directory'
Затем вы можете создать функцию проверки, которая делает что-то вроде
validate() { #validate input and & return 1 if failed, 0 if succeed if [[ ! -d "$1" ]]; then return 1 fi }
и функция die, которая прерывает скрипт при ошибке
die() { echo "$*" 1>&2 ; exit 1; }
Для дополнительных аргументов просто добавьте дополнительную строку, воспроизводящую формат.
: ${1?' You forgot to supply the first argument'} : ${2?' You forgot to supply the second argument'}
источник
Старый пост, но я решил, что все равно могу внести свой вклад.
Сценарий, вероятно, не нужен и с некоторой терпимостью к подстановочным знакам может быть выполнен из командной строки.
дикий где угодно совпадение. Давайте удалим все вхождения подпапки
Оболочка повторилась. Удалим определенные папки pre и post одной строкой
Shell итерация + var (проверено BASH).
источник