Альтернатива должна передать вывод по каналу и проанализировать его с последующими командами. Единственный безопасный способ сделать так состоит в том, чтобы использовать -print0
опция, которая говорит find
использовать нулевой символ в качестве разделителя результатов. Команды получения должны иметь способность распознать, что пустой указатель разграничил вход. Пример:
find /home/phunehehe -iregex '.*\.png$' -print0 | xargs -0 file
Обратите внимание что -0
опция говорит xargs
рассматривать вход как разграниченный пустой указатель.
Портативный ко всем оболочкам POSIX:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
Сделайте это ${foobar:+1}
если Вы хотите рассматривать foobar
тот же путь, пусто ли это или не определенное. Можно также использовать ${foobar-}
получить пустую строку когда foobar
не определено и значение foobar
иначе (или помещенный любое другое значение по умолчанию после -
).
В ksh, если foobar
объявляется, но не определяется, как в typeset -a foobar
, затем ${foobar+1}
расширяется до пустой строки.
Zsh не имеет переменных, которые объявляются, но не устанавливаются: typeset -a foobar
создает пустой массив.
В ударе массивы ведут себя другим и удивительным способом. ${a+1}
только расширяется до 1
если a
непустой массив, например.
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
Тот же принцип относится к ассоциативным массивам: переменные типа массив рассматривают, как определено, если у них есть непустое множество индексов.
Другой, особенный метод удара тестирования, была ли переменная какого-либо типа определена, состоит в том, чтобы проверить, перечислено ли это в ${!PREFIX*}
. Это сообщает о пустых массивах, как определено, в отличие от этого, ${foobar+1}
, но отчеты declared-unassigned (unset foobar; typeset -a foobar
) как неопределенный.
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
Это эквивалентно тестированию возвращаемого значения typeset -p foobar
или declare -p foobar
, за исключением того, что typeset -p foobar
сбои на declared-unassigned.
В ударе, как в ksh, set -o nounset; typeset -a foobar; echo $foobar
инициировал ошибку в попытке развернуть неопределенную переменную foobar
. В отличие от этого, в ksh, set -o nounset; foobar=(); echo $foobar
(или echo "${foobar[@]}"
) также инициировал ошибку.
Обратите внимание, что во всех ситуациях описал здесь, ${foobar+1}
расширяется до пустой строки если и только если $foobar
вызвал бы ошибку под set -o nounset
.
Для подведения с ответом Gilles, я составил мой после правил:
[[ -v foobar ]]
для переменных в версии Bash> = 4.2.declare -p foobar &>/dev/null
для переменных типа массив в версии Bash <4.2.(( ${foo[0]+1} ))
или (( ${bar[foo]+1} ))
для нижних индексов индексируемых (-a
) и включенный (-A
) массивы (declare
), соответственно. Опции 1 и 2 не работают здесь.Я использую ту же технику для всех переменных в ударе, и это работает, например:
[ ${foobar} ] && echo "foobar is set" || echo "foobar is unset"
выводы:
foobar is unset
пока
foobar=( "val" "val2" )
[ ${foobar} ] && echo "foobar is set" || echo "foobar is unset"
выводы:
foobar is set
foobar=""
затем сообщит это foobar is unset
. Никакие не ожидают, я забираю это. Действительно только тесты, если первый элемент пуст или нет, таким образом, это, кажется, только хорошая идея, если Вы знаете переменную, НЕ являются массивом, и Вы только заботитесь о пустоте, не definedness.
– Ron Burk
15.06.2015, 05:00
echo "${foobar:+1}"
не печатает1
еслиdeclare -a foobar
был ранее выпущен и таким образомfoobar
индексный массив.declare -p foobar
правильно отчетыdeclare -a foobar='()'
. Делает"${foobar:+1}"
только работа для непеременных типа массив? – Tim Friske 27.11.2012, 11:29${foobar+1}
(без:
, Я инвертировал два примера в своем исходном ответе), корректно для массивов в ударе, если Ваше определение “определенных”, “был бы$foobar
работа подset -o nounset
”. Если Ваше определение отличается, удар является немного странным. См. мой обновленный ответ. – Gilles 'SO- stop being evil' 27.11.2012, 12:560
индекс, ни ключ определяются, поскольку это верно дляa=()
,${a+1}
правильно возвраты ничто. – Tim Friske 27.11.2012, 23:57defined
оператор.Test
мог СДЕЛАТЬ это; это не может быть трудно (гм....) большое спасибо – will 11.04.2016, 17:48