1

У меня есть проблема, которая решается с помощью этого ответа 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-летний вопрос, так что я здесь.

2 ответа2

1

Это оператор управления

От Bash Man:

 The control operators && and || denote AND lists and OR lists, respectively.
 An AND list has the form
command1 && command2
command2 is executed if, and only if, command1 returns an exit status of zero. [..cut..] The return status of AND and OR lists is the exit status of the last command executed in the list.
Оператор управления
    A token that performs a control function.  It is one of the following symbols:
        || & && ; ;; ( ) | 
 

(кредиты)

Поэтому в этом случае не читайте && как логический оператор. Итак, теперь вы знаете, когда выполняется exit 1 - только при успешном выполнении предыдущей команды (если статус выхода был равен нулю).

См. Этот ответ на serverfault для объяснения && в 3 различных контекстах в Bash. Полезно для изучения различий между ними.

1

Он выходит из сценария в этой строке, если в сценарий не было передано ровно два аргумента.

  • $# - количество аргументов, переданных при вызове скрипта, аналогично argc в C

  • (( $# != 2 )) возвращается с кодом истинности ( 0 ), если количество аргументов не равно 2

  • && запускает правую сторону только в том случае, если левая сторона вышла с верным кодом. Это означает, что запускается правая часть, если количество аргументов не равно 2.

  • exit 1 выходит из сценария с кодом выхода falsey, равным 1 . Это прерывает сценарий на этом этапе и сообщает вызывающей стороне, что произошла ошибка.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .