Estou tentando executar o código abaixo, mas quando tento usar minha função na instrução if, recebo o -bash: [: too many arguments
erro. Por que isso está acontecendo?
Agradeço antecipadamente!
notContainsElement () {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 1; done
return 0
}
list=( "pears" "apples" "bananas" "oranges" )
blacklist=( "oranges" "apples" )
docheck=1
for fruit in "${list[@]}"
do
if [ notContainsElement "$fruit" "${blacklist[@]}" -a $docheck = 1 ]
then
echo $fruit
fi
done
Respostas:
Ao usar,
if [ ... ]
você está realmente usando o[
utilitário (que é o mesmo que,test
mas requer que o último argumento seja]
).[
não entende para executar sua função, espera seqüências de caracteres. Felizmente, você não precisa usar[
nada aqui (pelo menos para a função):Observe que também estou verificando o número inteiro primeiro, para que possamos evitar chamar a função se
$docheck
não for 1.Isso funciona porque
if
recebe um comando arbitrário e decide o que fazer a partir do status de saída desse comando. Aqui, usamos um[ ... ]
teste juntamente com uma chamada para sua função&&
, criando um comando composto. O status de saída do comando composto seria verdadeiro se o[ ... ]
teste e a função retornassem zero como status de saída, sinalizando sucesso.Como uma nota de estilo, eu não teria o teste de função se a matriz não não contêm o elemento, mas se se faz contêm o elemento e, em seguida,
Ter um teste de função uma bagunça vontade negativa a lógica em casos onde você fazer quer testar se a matriz contém o elemento (
if ! notContainsElement ...
).fonte
tentar
-a
opção não é um shell ou umatest
opçãoaqui você tem teste em duas partes
você liga então
if
usandocomo indicado
-a
é uma opção de teste, mas só pode ser usado com outra opção de teste, portanto, você pode usarpara testar que
$a
é menor que ambos$b
e$c
, mas você não pode usar outro comando no escopo de teste.fonte
-a
é uma opção de teste , significa AND.$docheck
, unquoted$a
/$b
/ etc no último exemplo).Aqui está uma alternativa que algumas pessoas podem não gostar. Converta sua matriz da lista negra em uma sequência e veja se a sequência com uma fruta removida é a mesma. Editado para preencher as strings com espaços. Agradecemos a Scott por apontar o problema da maçã / abacaxi.
Eu acho que isso é mais simples, mas falta a lógica && que muitos preferem.
fonte
list
frutas estar contida em uma delasblacklist
. Por exemplo, se mudarmosblacklist
para( "oranges" "pineapples" )
, a saída do seu script não mudará. ... (continua)&&
? (3) Quando você publicar um código, identifique-o adequadamente.two words
e dois itens subsequentestwo
ewords
. E se sua lista continha*
como uma entrada, ela corresponderia a tudo. (E porque você não está citando o$f
no que deveria serecho "$f"
, se você se tentar repetir tal elemento, seria substituída por uma lista de nomes de arquivos no diretório atual).