Используя $? в, если оператор

Это работает на конкретный случай выше:

rename --verbose 's/^index-([0-9]+)\.txt$/$1/; $_="index-" . ($_ + 1) . ".txt"' $(printf '%s\n' index-*.txt | sort --field-separator - --key 2n | tac)

Но:

  1. это не обрабатывает пробел в именах файлов, и
  2. это было бы намного более сложно для произвольных имен файлов.
12
05.02.2014, 05:56
5 ответов

Добавьте пространство после [, и другой прежде ]:

function foo {
   (cd $FOOBAR;
   <some command>
   if [ $? -ne 0 ]
   then
      echo "Nope!"
   else
      echo "OK!"
   fi
   )
}

[ встроенная оболочка, это - команда точно так же, как echo, read, expr... это нуждается в пространстве после него и требует соответствия ].

Запись [ $? -ne 0 ] на самом деле вызывает [ и давая ему 4 параметра: $?, -ne, 0, и ].

Примечание: то, что Вы получаете ошибку при высказывании [1: command not found средства это $? имел значение 1.

33
27.01.2020, 19:54
  • 1
    я просто проверил, что Ваш ответ корректен на моем VM Linux. –  samiam 05.02.2014, 00:14
  • 2
    [ ссылка на test также –  Ricky Beam 05.02.2014, 03:15
  • 3
    @RickyBeam в большинстве оболочек, [ встроенная оболочка, и /usr/bin/[ редко используется. флаг –  Patrick 05.02.2014, 15:23

Или Вы могли пропустить $? в целом. Если Ваша команда cmd, следующее должно работать:

function foo {
   (cd $FOOBAR;
   if cmd
   then
      echo "OK!"
   else
      echo "Nope!"
   fi
   )
}
20
27.01.2020, 19:54

Это - хорошая практика для присвоения возвращаемого значения переменной перед использованием его

retval="$?"
if [ $retval -ne 0 ]

Это позволяет Вам снова использовать возвращаемое значение. например, в, если... elif... еще... оператор.

6
27.01.2020, 19:54
  • 1
    1: Вы забыли пространство после [ (Без пространства это становится синтаксической ошибкой в bash) Отменит, если Вы отредактируете и зафиксируете свою ошибку. –  samiam 05.02.2014, 00:15
  • 2
    Да, Вы правы. Я зафиксировал его. –  Abdul 05.02.2014, 00:15
  • 3
    @samiam, которые длятся комментарий, был направлен на Вас –  terdon♦ 05.02.2014, 00:16
  • 4
    :), Вы могли развернуть свой ответ немного. Почему это - хорошая практика? Каких ошибок можно было избежать? –  terdon♦ 05.02.2014, 00:19
  • 5
    @terdon это - плохая практика для использования $? непосредственно, потому что это повредится когда-нибудь, при редактировании сценария позже, при помещении строки между командой и $? проверить. –  samiam 05.02.2014, 00:21

Единственная причина, почему Вы хотели бы использовать $? как аргументы a [ команда (ли это [ команда выполняется в части условия if оператор или не), когда Вы хотите различить на определенном статусе возврата, как:

until
  cmd
  [ "$?" -gt 1 ]
do
  something
done

Синтаксис для всех они if, while, until... операторы

if cmd-list1
then cmd-list2
else cmd-list3
fi

Который работает cmd-list2 если cmd-list1 успешно или cmd-list3 иначе.

[ "$?" -eq 0 ] команда нет. Это устанавливает $? к 0, если $? 0, и $? к ненулевому, если это было ненулевым.

Если Вы хотите, выполняет что-то если cmd неудавшийся, это:

if ! cmd
then ...
fi

Обычно Вы не должны переделывать $? уже не говоря о знают, который означает значение true или false. Единственные случаи - как я сказал выше, если необходимо различить на определенном значении, или если необходимо на потом сохранить его (например, для возврата его как возвращаемого значения функции) как:

f() {
  cmd; ret=$?
  some cleanup
  return "$ret"
}

Также помните, что отъезд закрывшей кавычки переменной является split+glob оператором. Не имеет смысла вызывать тот оператор здесь, таким образом, это должно быть:

[ "$?" -ne 0 ]

нет [ $? -ne 0 ], уже не говоря о [$? -ne 0 ] (который только вызвал бы [ команда, если $IFS произошедший для содержания первого символа $?).

Также обратите внимание, что Bourne способ определить функцию должен придерживаться function-name() перед командой. Это имеет место в каждом Bourne как оболочка кроме bash и yash (и последние версии posh) которые только позволяют составную команду (составное команда быть {...} или (...) или вещи как for...done, if...fi...

function foo { ... } ksh функциональный синтаксис определения. Нет никакой причины, почему Вы хотели бы использовать его здесь.

Ваш код может быть портативно записанный (POSIXly):

foo() (
  cd -P -- "$FOOBAR" || return # what if the cd failed!
  if
    <some command>
  then
    echo 'OK!'
  else
    echo 'Nope!'
  fi
)

Также отметьте это cd без -P имеет совершенно особое значение (пути дескрипторов, которые содержат .. компоненты по-другому по сравнению с любой другой командой), таким образом, лучше включать его в сценарии для предотвращения беспорядков.

(та функция возвраты false если cd сбои, но не, если <some command> сбои).

3
27.01.2020, 19:54

Я действительно полагаю, что команда ниже сделает все, что Вы хотите в одной строке.

(( verify = $?!=0?'Nope!':'OK!' ))
1
27.01.2020, 19:54

Теги

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