多个条件'如果'

时间:2015-10-21 16:16:29

标签: bash if-statement multiple-conditions

我试图编写一个bash脚本,它循环遍历给定文件夹中两个字符串之一的目录。我写了以下内容:

for aSubj in /wherever/*
    if [ [ -d $aSubj ] && [ [ $aSubj == hu* ] || [ $aSubj == ny* ] ] ]; then
        .
        .
    fi
done

当我尝试运行此操作时,如果'如果':语法错误接近意外令牌,则会出现语法错误' if'

有谁可以指出我哪里出错了?

2 个答案:

答案 0 :(得分:1)

第一行应该是

for aSubj in /wherever/*; do

答案 1 :(得分:1)

如果您想提及多个条件,请将它们与( )

嵌套
$ d=23
$ ( [ $d -ge 20 ] && [ $d -ge 5 ] ) || [ $d -ge 5 ] && echo "yes"
yes

但是,在这种情况下,您可能希望使用Check if a string matches a regex in Bash script中描述的正则表达式:

[[ $aSubj =~ ^(hu|ny)* ]]

这会检查变量$aSubj中的内容是以hu还是ny开头。

甚至可以使用正则表达式来获取文件。例如,以下内容将匹配名称以ttt/a开头的b目录中的所有文件:

for file in ttt/[ab]*

请注意,您也可以使用process substitutionfind包含正则表达式(How to use regex in file find中的示例)来提供循环:

while IFS= read -r file
do
   # .... things
done < <(find your_dir -mindepth 1 -maxdepth 1 -type d -regex '.*/\(hu\|ny\).*')

例如,如果我有以下目录:

$ ls dirs/
aa23  aa24  ba24  bc23  ca24

如果我查找名称以cabc开头的目录,我会得到此结果:

$ find dirs -mindepth 1 -maxdepth 1 -type d -regex '.*/\(ca\|bc\).*'
dirs/bc23
dirs/ca24