Джесси _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
Вы можете использовать '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
#!/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