Shell脚本中的布尔表达式
时间:2020-03-05 18:49:03 来源:igfitidea点击:
以布尔表达式执行以下操作的"正确"方法是什么?
for i in `ls /resources`; do if [ $i != "database.db" ] then if [ $i != "tiles" ] then if [ $i != "map.pdf" ] then if [ $i != "map.png" ] then svn export -q /resources/$i ../MyProject/Resources/$i ...
解决方案
回答
for i in `ls /resources`; do if [ $i != "database.db" ] && [ $i != "tiles" ] && [ $i != "map.pdf" ] && [ $i != "map.png" ]; then svn export -q /resources/$i ../MyProject/Resources/$i
回答
甚至更短:
for i in `ls /resources`; do if [ $i != databse.db -a $i != titles -a $i != map.pdf ]; then svn export -q /resources/$i ../MyProject/Resources/$i fi done;
if表达式中的-a与shell测试中的布尔AND等效。有关更多信息,请参见man test
。
回答
其他解决方案有两个常见错误:
http://www.pixelbeat.org/programming/shell_script_mistakes.html
- 对于$(ls ...)中的i来说是多余的/有问题的,只是这样做:
对于$ 1 /资源中的i *。做...
[$ i!= file1 -a $ 1!= file2]
实际上有两个问题。一种。 $ i不加引号,因此带空格的名称将引起问题b。如果stat
正在归档文件,则-a效率不高,因为它不会短路(我知道上面的内容不是stat
ing文件)。
因此,请尝试:
for i in /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
回答
考虑使用一个case语句:
for i in $(ls /resources); do case $i in database.db|tiles|map.pdf|map.png) ;; *) svn export -q /resources/$i ../MyProject/Resources/$i;; esac done