function foo {
(cd $FOOBAR;
<some command>
if [$? -ne 0]
then
echo "Nope!"
else
echo "OK!"
fi
)
}
Я пытаюсь написать функцию, подобную приведенной выше, и поместить ее в мой файл .bashrc. После того как я запустил файл и запустился, я получил:
Общее время: 51 секунда
-bash: [1: команда не найдена
ОК!
Может кто-нибудь помочь мне понять, что я сделал не так?
$?
оно равно 0 сif
оператором, бессмысленно,if
ожидает команду, и если указанная команда возвращается0
, она запускает код в блоке. такif true; then echo hello; fi
будет эхо привет, так как командаtrue
вернулась0
.$?
содержит состояние последнего конвейера , который не является командойtest
([
) вif
инструкции. Пример тестирует,some command
был ли успешным. Вы можете сделать то же самое с&&
и||
, но это может сделать длинные нечитаемые строки по сравнению сif [ $? -eq 0 ]
. Тот же самый аргументif some command
$?
распространяется, я указываю, что нет смысла вtest
использовании; посколькуif some command
делает то же самое с одним утверждением, а не с двумя отдельными утверждениями. если команда уже длинная, добавление еще трех символов не сделает «нечитабельный» ужасно более «нечитаемым».Ответы:
Добавьте пробел после
[
, а другой перед]
:[
это встроенная команда оболочки, это команда так же , какecho
,read
,expr
... он нуждается в пространстве после нее, и требует согласования]
.Запись
[ $? -ne 0 ]
на самом деле вызов[
и придание ей 4 параметра:$?
,-ne
,0
, и]
.Примечание: тот факт, что вы получаете сообщение об ошибке,
[1: command not found
означает, что$?
он имеет значение1
.источник
[
это ссылка ,test
а также[
- встроенная оболочка,/usr/bin/[
которая используется редко.Или вы могли бы
$?
вообще пропустить . Если ваша командаcmd
, следующее должно работать:источник
Рекомендуется присвоить возвращаемое значение переменной перед ее использованием.
Это позволяет повторно использовать возвращаемое значение. например, в выражении if ... elif ... else ...
источник
[
(без пробела это становится синтаксической ошибкой вbash
). Отменит, если вы редактируете и исправляете свою ошибку.$?
непосредственного использования, потому что это сломается, если вы когда-либо, когда будете редактировать скрипт позже, ставите строку между командой и$?
проверкой.Единственная причина, по которой вы хотите использовать в
$?
качестве аргументов[
команды (независимо от того,[
выполняется ли эта команда в условной частиif
оператора или нет), заключается в том, что вы хотите различать определенный возвращаемый статус, например:Синтаксис для всех тех
if
,while
,until
... заявления являетсяКоторый работает,
cmd-list2
еслиcmd-list1
успешно илиcmd-list3
иначе.[ "$?" -eq 0 ]
Команда является не оп. Устанавливается$?
в 0, если$?
равно 0, и$?
в ненулевое, если оно не было нулевым.Если вы хотите запустить что-то в случае
cmd
неудачи, это:Как правило, вам не нужно возиться с не
$?
говоря уже о том, какое значение означаетtrue
илиfalse
. Единственные случаи, как я уже говорил выше, если вам нужно различить определенное значение или если вам нужно сохранить его на потом (например, чтобы вернуть его как возвращаемое значение функции), например:Также помните, что если оставить переменную без кавычек, это оператор split + glob. Вызывать этот оператор здесь не имеет смысла, поэтому должно быть:
нет
, не говоря уже о том[ $? -ne 0 ]
(что будет вызывать[$? -ne 0 ]
[
команду только в том случае, если она$IFS
содержит первый символ$?
).Также обратите внимание, что Bourne-способ определения функции - придерживаться
function-name()
команды. Это происходит в каждом Bourne , как оболочки , за исключениемbash
иyash
(и последние версииposh
) , которые позволяют только команда соединения (соединение команды являются{...}
или(...)
или тому подобнымfor...done
,if...fi
...function foo { ... }
этоksh
синтаксис определения функции. Там нет причин, почему вы хотели бы использовать его здесь.Ваш код может быть записан (POSIXly):
Также обратите внимание, что
cd
без-P
него имеет особое значение (обрабатывает пути, содержащие..
компоненты, отличные от любой другой команды), поэтому лучше включать его в сценарии, чтобы избежать путаницы.(эта функция возвращается в
false
случаеcd
сбоя, но не в случае<some command>
сбоя).источник
Я верю, что команда ниже сделает все, что вы хотите в одной строке.
источник