Expressões Booleanas em Shell Scripts
-
09-06-2019 - |
Pergunta
Qual é a maneira "certa" de fazer o seguinte como uma expressão booleana?
for i in `ls $1/resources`; do
if [ $i != "database.db" ]
then
if [ $i != "tiles" ]
then
if [ $i != "map.pdf" ]
then
if [ $i != "map.png" ]
then
svn export -q $1/resources/$i ../MyProject/Resources/$i
...
Solução
As outras soluções apresentam alguns erros comuns:http://www.pixelbeat.org/programming/shell_script_mistakes.html
for i in $(ls ...)
é redundante/problemático apenas fazer:for i in $1/resources*; do ...
[ $i != file1 -a $1 != file2 ]
Na verdade, isso tem 2 problemas.a.O
$i
não é citado, portanto, nomes com espaços causarão problemasb.
-a
é ineficiente sestat
arquivos, pois não causa curto-circuito (eu sei que o acima não éstat
arquivos).
Então, em vez disso, tente:
for i in $1/resources/*; do
if [ "$i" != "database.db" ] &&
[ "$i" != "tiles" ] &&
[ "$i" != "map.pdf" ] &&
[ "$i" != "map.png" ]; then
svn export -q "$i" "../MyProject/Resources/$(basename $i)"
fi
done
Outras dicas
Ainda mais curto:
for i in `ls $1/resources`; do
if [ $i != databse.db -a $i != titles -a $i != map.pdf ]; then
svn export -q $1/resources/$i ../MyProject/Resources/$i
fi
done;
O -a
na expressão if é equivalente ao booleano AND nos testes de shell.Para mais veja man test
Considere usar um caso declaração:
for i in $(ls $1/resources); do
case $i in
database.db|tiles|map.pdf|map.png)
;;
*)
svn export -q $1/resources/$i ../MyProject/Resources/$i;;
esac
done
for i in `ls $1/resources`; do
if [ $i != "database.db" ] && [ $i != "tiles" ] && [ $i != "map.pdf" ] && [ $i != "map.png" ]; then
svn export -q $1/resources/$i ../MyProject/Resources/$i
Para referência futura, o novo operador de teste [[ é o preferido.A resposta aceita está próxima e tudo o que foi mencionado se aplica, mas essa resposta exigirá muitas citações e chamadas para vários testes.
O método preferido seria algo como:
for i in $1/resources/*; do
if [[ $i != "database.db" && $i != "tiles" &&
$i != "map.pdf" && $i != "map.png" ]]; then
svn export -q "$i" "../MyProject/Resources/$(basename $i)"
fi
done