У меня есть проблема, которую решает этот ответ.https://superuser.com/a/508761
Теперь мне нужно расширить его, чтобы делать другие вещи, но сначала мне нужно лучше понять, как он работает, прежде чем его модифицировать. Вот скрипт, о котором идет речь:
#!/bin/bash
(( $# != 2 )) && exit 1
for f in *; do
newf="${f//$1/$2}"
if [[ $f != $newf ]]; then
mv "$f" "$newf"
fi
done
Что делает (( $# != 2 )) && exit 1
? Мне не очень повезло найти объяснения в сети: я узнал, что представляет собой каждый компонент, но не то, что делает вся строка в сценарии в целом. Ответ не объяснял эту строку. Автор в последний раз был онлайн более 2 лет назад, и я не хотел некропостировать вопрос 5-летней давности, поэтому вот он.
решение1
Это оператор управления.
Отбаш человек:
Операторы управления && и || обозначают списки И и списки ИЛИ соответственно. Список AND имеет видАоператор управленияявляется
command1 && command2
command2 выполняется тогда и только тогда, когда command1 возвращает нулевой статус выхода. [..резать..] Статус возврата списков AND и OR — это статус выхода последней команды. выполнено в списке.
Токен, выполняющий функцию управления. Это один из следующих символов: || & && ; ;; ( ) |
Так что в этом случае не читайте &&
как логический оператор. Так что теперь вы знаете, когда exit 1
выполняется – только при успешном выполнении предыдущей команды (если статус выхода был нулевым).
Видеть этоserverfault ответдляобъяснение &&
в 3 различных контекстах в Bash.Полезно для изучения различий между ними.
решение2
Он завершает работу скрипта на этой строке, если скрипту не было передано ровно два аргумента.
$#
— это количество аргументов, переданных при вызове скрипта, аналогичноargc
в C(( $# != 2 ))
возвращает код truey (0
), если количество аргументов не равно2
&&
запускает правую часть только если левая часть завершилась с кодом truey. Это означает, что правая часть запускается, если число аргументов не равно 2.exit 1
завершает работу скрипта с кодом выхода falsey1
. Это прерывает выполнение скрипта в этой точке и информирует вызывающего об ошибке.