Возврат "продолжить" из функции, вызванной из цикла

Джесси _b уже ответил на вопрос, но я думаю, что стоит развеять некоторые возможные заблуждения.

В оболочке есть символы, которые имеют особое значение при определенных условиях. Например,:|используется в конвейерах, >в перенаправлениях, \для экранирования символов и т. д. Эти символы не интерпретируются оболочкой буквально, поэтому, когда вы делаете echo foo>bar, foo>barвыигрывает. t будет распечатан на вашем терминале, но fooбудет перенаправлен в файл bar.

К счастью, оболочка также имеет механизм, который заставляет эти символы терять свое особое значение :цитирования. В оболочках POSIX есть 3 механизма цитирования:

  • Обратная косая черта\:сохраняет буквальное значение следующего символа, за исключением .
  • Двойные -кавычки"...":сохраняет буквальное значение всех символов в двойных -кавычках, за исключением символов `, $и \.
  • Одинарные -кавычки'...':сохраняет буквальное значение каждого символа в одинарных -кавычках, без исключений.

Итак, следуя предыдущему примеру, если бы мы хотели напечатать foo>barбуквально, мы могли бы сделать:

  • echo foo\>bar
  • echo "foo>bar"
  • echo 'foo>bar'

Звездочка *— один из этих специальных символов, он является частью нотации сопоставления с образцом и используется для расширения имени файла . Другими словами, такие команды, как echo *.txt, заменят шаблон файлами, которым шаблон соответствует.

В вашем случае cron_daily/wp_cli.sh*соответствует только cron_daily/wp_cli.sh, поэтому mvвидит 2 одинаковых аргумента и жалуется на это. Это нормально, потому что файла cron_daily/wp_cli.sh*нет. Но если бы у вас был реальный файл cron_daily/wp_cli.sh*и другие файлы, которые можно было бы сопоставить с шаблоном, mvне удалось бы.

Рассмотрим следующий сценарий:

$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file*
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3

Если я попытаюсь переименовать file*без использования кавычек:

$ mv file* new_file
mv: target 'new_file' is not a directory

Это потому, что это аргументы, которые получает mv, поэтому ожидается, что new_fileбудет каталогом:

$ printf '[%s]\n' file* new_file
[file*]
[file1]
[file2]
[file3]
[new_file]

Чтобы успешно переименовать file*, мне нужно заключить этот аргумент в кавычки:

$ mv 'file*' new_file
$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3
-rw-rw-r-- 1 user group 0 jul 14 12:00 new_file

2
30.07.2020, 18:55
2 ответа

Вы можете использовать 'return `с параметром, например следующим:

#!/bin/bash

AFunction () {
    if [[ "${RED}" -lt 3 ]]; then
        echo "cont"
        return 1
    else
        echo "nope"
        return 0
    fi
}

for i in 1 2 3 4 5
do
    RED=${i}
    if AFunction
    then
    echo ${i}
    fi
done
3
18.03.2021, 23:16
#!/bin/sh

AFunction () {
    [ "${RED}" -lt 3 ]
}

for i in 1 2 3 4 5
do
    RED=${i}
    if AFunction
    then
      echo "cont"
    else
      echo "nope"
      echo ${i}
    fi
done
0
18.03.2021, 23:16

Теги

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