Возвращаемое значение функции ksh в скобках - PullRequest
6 голосов
/ 16 января 2012

В следующем очень простом примере сценария ksh мне нужно спросить, равняется ли func1 4,

Это то, что я сделал в примере, но этот скрипт не печатает «результат функции = 4», как я ожидал.

Что мне нужно изменить в [[......]], чтобы вывести «function result = 4»

Примечание - func1 должен быть в [[.....]]

  #!/bin/ksh

  func1()
  {
    return 4
  }

  [[ ` func1 ` = ` echo $? `  ]]  && print "function result = 4"  

Ответы [ 2 ]

11 голосов
/ 16 января 2012

Вам нужно

#!/bin/ksh

  func1()
  {
    print -- 4
  }

  [[ $(func1) = 4  ]]  && print "function result = 4"  

ИЛИ

#!/bin/ksh

  func1()
  {
    return 4
  }

  func1 ; [[ $? == 4 ]]  && print "function result = 4"

Есть несколько проблем в коде, который вы представляете, поэтому позвольте мне попытаться объяснить (Вы делаете это более сложным, чемэто должно быть).

Нет.1 - это использование обратных тиков для подстановки команд, они устарели на языке ksh с ~ 1995 года!Используйте $ (... cmd) для современной замены cmd.Мы часто видим обратные пометки, перечисленные как дань переносимости, но только обратные пометки требуют использования только сценариев, написанных для систем, где оболочка Bourne - это оболочка only .(ну, я не знаю насчет черты или пепла, так что, может быть, тоже).

Нет 2. это $?устанавливается после выполнения любой функции, команды или конвейера и является кодом возврата этой последней команды.Это значение между 0-255.Когда у вас есть код вроде cmd ; rc=$? ; echo $?;теперь вы повторяете статус назначения rc=$? (который почти всегда будет равен 0), и именно поэтому вы увидите, что опытные сценаристы сохранят значение $?прежде чем делать что-либо еще с этим.

Напомним, что подстановка команд использует то, что когда-либо является выводом команды $( ... cmd ...) или backtics, заключенной в оболочку, тогда как return устанавливает значение $? (до самого следующего выполнения команды сбрасывает это значение).

Надеюсь, это поможет.

4 голосов
/ 16 января 2012

Функция возвращает 4. Оператор `` (backticks) игнорирует значение результата и возвращает вместо него стандартный вывод функции (в вашем случае пустая строка, так как func1 ничего не печатал в стандартный вывод).

И

`echo $?`

- это слишком сложный способ сказать

$?
...