Это работает на конкретный случай выше:
rename --verbose 's/^index-([0-9]+)\.txt$/$1/; $_="index-" . ($_ + 1) . ".txt"' $(printf '%s\n' index-*.txt | sort --field-separator - --key 2n | tac)
Но:
Добавьте пространство после [
, и другой прежде ]
:
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
.
Или Вы могли пропустить $?
в целом. Если Ваша команда cmd
, следующее должно работать:
function foo {
(cd $FOOBAR;
if cmd
then
echo "OK!"
else
echo "Nope!"
fi
)
}
Это - хорошая практика для присвоения возвращаемого значения переменной перед использованием его
retval="$?"
if [ $retval -ne 0 ]
Это позволяет Вам снова использовать возвращаемое значение. например, в, если... elif... еще... оператор.
[
(Без пространства это становится синтаксической ошибкой в bash
) Отменит, если Вы отредактируете и зафиксируете свою ошибку.
– samiam
05.02.2014, 00:15
$?
непосредственно, потому что это повредится когда-нибудь, при редактировании сценария позже, при помещении строки между командой и $?
проверить.
– 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>
сбои).
Я действительно полагаю, что команда ниже сделает все, что Вы хотите в одной строке.
(( verify = $?!=0?'Nope!':'OK!' ))
[
ссылка наtest
также – Ricky Beam 05.02.2014, 03:15[
встроенная оболочка, и/usr/bin/[
редко используется. флаг – Patrick 05.02.2014, 15:23