Существует два случая, где я нахожу :
полезный:
#!/bin/sh
# set VAR to "default value" if not already set in the environment
: "${VAR=default value}"
# print the value of the VAR variable. Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR}"
Это - удобный способ позволить пользователям Вашего сценария оболочки переопределять установку, не редактируя сценарий. (Однако параметры командной строки лучше, потому что Вы не рискуете неожиданным поведением, если у пользователя по совпадению есть переменная, Вы используете в их экспортируемой среде.) Вот то, как пользователь переопределил бы установку:
VAR="other value" ./script
${VAR=value}
синтаксис говорит для установки VAR
кому: value
если VAR
уже не установлен, затем расширьтесь до значения переменной. Так как мы просто еще не заботимся о значении переменной, это передается как аргумент никакой-op команде :
выбрасывать его.
Даже при том, что :
не-op команда, расширение выполняется оболочкой (не :
команда!) прежде, чем работать :
управляйте, таким образом, переменное присвоение все еще происходит (если применимо).
Также было бы приемлемо использовать true
или некоторая другая команда вместо :
, но код становится более твердым читать, потому что намерение менее ясно.
Следующий сценарий также работал бы:
#!/bin/sh
# print the value of the VAR variable. Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR=default value}"
Но вышеупомянутое намного более трудно поддержать. Если использование строки ${VAR}
добавляется выше этого printf
строка, расширение присвоения по умолчанию должно быть перемещено. Если разработчик забывает перемещать то присвоение, ошибка представлена.
Пустых условных блоков нужно обычно избегать, но они иногда полезны:
if some_condition; then
# todo: implement this block of code; for now do nothing.
# the colon below is a no-op to prevent syntax errors
:
fi
Некоторые люди утверждают что, имея пустое истинное if
блок может сделать код легче читать, чем отрицание теста. Например:
if [ -f foo ] && bar || baz; then
:
else
do_something_here
fi
возможно легче читать, чем:
if ! [ -f foo ] || ! bar && ! baz; then
do_something_here
fi
Однако я полагаю, что существует несколько альтернативных подходов, которые лучше, чем пустой истинный блок:
Поместите условие в функцию:
exotic_condition() { [ -f foo ] && bar || baz; }
if ! exotic_condition; then
do_something_here
fi
Поместите условие в фигурных скобках (или круглые скобки, но круглые скобки порождают процесс подоболочки, и любые изменения, внесенные в среду в подоболочке, не будут видимы вне подоболочки) перед отрицанием:
if ! { [ -f foo ] && bar || baz; } then
do_something_here
fi
Использовать ||
вместо if
:
[ -f foo ] && bar || baz || {
do_something_here
}
Я предпочитаю этот подход, когда реакция является простой остротой, такой как утверждение условий:
log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$@"; exit 1; }
[ -f foo ] && bar || baz || fatal "condition not met"
Можно использовать шарик как так:
mv S-000001-*.xml dir-to-move-to
for x in `ls S*.xml | egrep -o '[0-9]{6}' | sort | uniq`; do mkdir -p /tmp/$x; cp S-$x-* /tmp/$x/.; done
Это создаст папку ID (для каждого идентификатора) в/tmp и затем скопирует там все файлы с тем же идентификатором.
Можно заменить cp
с mv
если тесты в порядке.
Я предположил, что идентификатор имеет 6 цифр, и все другие числа меньше.
find /path/to/old/directory -name 'S-??????-?-?.xml' -type f -print0 | \
xargs -r0 mv -vt /path/to/new/directory