我试图制作一个小的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语句中动态地使用它。
但我无法找到合适的[]
{}
''
""
()
``
来使其正常运作。
对此或任何完全不同的方法的任何帮助都会有所帮助。
答案 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 ];
应该工作。