No meu script, estou tentando verificar o erro se o primeiro e único argumento é igual a -v, mas é um argumento opcional. Eu uso uma instrução if, mas continuo recebendo o erro esperado do operador unário.
este é o código:
if [ $1 != -v ]; then
echo "usage: $0 [-v]"
exit
fi
Editar:
Devo ser mais específico: esta parte do script acima verifica um argumento opcional e, depois, se o argumento não for inserido, deve-se executar o restante do programa.
#!/bin/bash
if [ "$#" -gt "1" ]; then
echo "usage: $0 [-v]"
exit
fi
if [ "$1" != -v ]; then
echo "usage: $0 [-v]"
exit
fi
if [ "$1" = -v ]; then
echo "`ps -ef | grep -v '\['`"
else
echo "`ps -ef | grep '\[' | grep root`"
fi
echo "usage: $0 [-v]"
;$-
mostra os sinalizadores de opção do shell ativo, não o nome do script atual.$-
é o nome do script atual. é.$0
Respostas:
Citações!
Caso contrário, quando
$1
estiver completamente vazio, seu teste se tornará:ao invés de
... e
!=
não é um operador unário (ou seja, capaz de receber apenas um único argumento).fonte
if [[ $1 != -v ]]; then
IFS=1
, então[ $# -eq 1 ]
não se comportará tão bem, mas[ "$#" -eq 1 ]
se comportará como pretendido mesmo assim. É um caso patológico, com certeza, mas é melhor escrever um software que não os tenha, quando puder.Ou pelo que parece um exagero desenfreado, mas na verdade é simplista ... Quase cobre todos os seus casos, e nenhuma string vazia ou preocupações unárias.
No caso do primeiro argumento ser '-v', faça seu condicional
ps -ef
, senão, em todos os outros casos, lance o uso.Se não se importa onde está o argumento '-v', simplesmente coloque o caso dentro de um loop. Isso permitiria percorrer todos os args e encontrar '-v' em qualquer lugar (desde que exista). Isso significa que a ordem dos argumentos da linha de comando não é importante. Esteja avisado, conforme apresentado, a variável arg_match está definida, portanto, é apenas um sinalizador. Ele permite várias ocorrências do argumento '-v'. Pode-se ignorar todas as outras ocorrências de '-v' facilmente.
Porém, permitir várias ocorrências de um argumento é conveniente para uso em situações como:
Não nos importamos com a ordem dos argumentos e até permitimos vários argumentos -u. Sim, é simples permitir também:
fonte
$*
não deve ser usado neste contexto: ele concatena itens em uma string que é dividida em string e expandida por glob; ao contrário"$@"
, o que deixa os itens com seus valores originais precisos. E você está perdendo algumas citações, que shellcheck.net irá capturar (com os avisos vinculados a uma página wiki que descreve por que essas citações foram importantes).-U'Bob Barker'
,;for arg in $*
vai vê-lo como-UBob
e, em seguida,Barker
como um item separado; considerando quefor item in "$@"
será visto-UBob Barker
como uma única string.