如果声明需要匹配多种可能性

时间:2016-09-26 13:47:18

标签: bash variables if-statement

我试图制作一个小的bash脚本来过滤FTP服务器的几个传递文件夹中的某些文件,当文件符合某个文件命名约定时,它应该通过。

我创建了一个处理文件夹的功能。

#!/bin/bash

function folder_search {
find FILE in `find ${DIR}/ -maxdepth 1 -type f -mmin +5 -name "*.doc" `; do
BASENAME=`basename $FILE`
if [[ $BASENAME == $NAMECONV1 or $BASENAME == $NAMECONV2 ]]
then
  "some commands"
else
  "some other commands"
fi
}

#folder 1
DIR=/tmp/folder1
NAMECONV1="ABC[0-9][0-9][0-9].doc"
NAMECONV2="NL[0-9][0-9][0-9].doc"
folder_search

#folder 2
DIR=/tmp/folder2
NAMECONV1="ABC[0-9][0-9][0-9].doc"
NAMECONV2="B[0-9][0-9][0-9].doc"
folder_search

有超过40个文件夹,每个文件夹都有自己接受的命名约定,所以我需要通过变量在IF语句中动态地使用它。

但我无法找到合适的[] {} '' "" () ``来使其正常运作。

对此或任何完全不同的方法的任何帮助都会有所帮助。

3 个答案:

答案 0 :(得分:2)

or中的逻辑bash运算符为||

if [[ $BASENAME == $NAMECONV1 || $BASENAME == $NAMECONV2 ]]

答案 1 :(得分:1)

您的函数应正确封装其参数,以便每次调用它时都不会设置全局变量。也许是这样的。

#!/bin/bash

# for portability, don't use the function keyword
folder_search () {
    # Don't use uppercase for your private variable names
    local dir=$1
    local pat1=$2
    local pat2=$3
    local filename base
    # Don't loop over `find` with for
    find "$dir" -maxdepth 1 -type f -mmin +5 -name "*.doc" -print |
    while IFS='' read -r filename; do
        base=$(basename "$filename")
        if [[ "$base" == $pat1 || "$base" == $pat2 ]]; then
          "some commands"
        else
          "some other commands"
        fi
    done
}

#folder 1
folder_search /tmp/folder1 "ABC[0-9][0-9][0-9].doc" "NL[0-9][0-9][0-9].doc"

#folder 2
folder_search /tmp/folder2 "ABC[0-9][0-9][0-9].doc" "B[0-9][0-9][0-9].doc"

对于包含换行符的文件名,find -print | while read循环仍然不健壮,但至少可以解决文件名中的水平空格,原始代码没有。

答案 2 :(得分:-1)

尝试将if语句分开:

if [ $this == $that ] || [ $that !- $something ];

应该工作。