Espressioni booleane negli script di shell
-
09-06-2019 - |
Domanda
Qual è il modo "giusto" per eseguire quanto segue come espressione 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
...
Soluzione
Le altre soluzioni presentano un paio di errori comuni:http://www.pixelbeat.org/programming/shell_script_mistakes.html
for i in $(ls ...)
è ridondante/problematico solo:for i in $1/resources*; do ...
[ $i != file1 -a $1 != file2 ]
Questo in realtà ha 2 problemi.UN.IL
$i
non è citato, quindi i nomi con spazi causeranno problemiB.
-a
è inefficiente sestat
ing file in quanto non va in cortocircuito (so che quanto sopra non lo èstat
file).
Quindi prova invece:
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
Altri suggerimenti
Ancora più breve:
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;
IL -a
nell'espressione if è l'equivalente del booleano AND nei test di shell.Per ulteriori informazioni vedere man test
Considera l'utilizzo di a caso dichiarazione:
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
Per riferimento futuro, è preferito il nuovo operatore di test [[.La risposta accettata è vicina e si applica tutto ciò che è stato menzionato, ma tale risposta richiederà molte citazioni e chiamate a più test.
Il metodo preferito sarebbe qualcosa del tipo:
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