Bash '上的多个条件;如果';

Bash '上的多个条件;如果';,bash,if-statement,multiple-conditions,Bash,If Statement,Multiple Conditions,我试图编写一个bash脚本,在给定文件夹中以两个字符串之一开头的目录上循环。我写了以下内容: for aSubj in /wherever/* if [ [ -d $aSubj ] && [ [ $aSubj == hu* ] || [ $aSubj == ny* ] ] ]; then . . fi done 当我尝试运行此命令时,在“if”行上出现语法错误:意外标记“if”附近出现语法错误 有人能指出我哪里出了问题吗?第一行应

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

for aSubj in /wherever/*
    if [ [ -d $aSubj ] && [ [ $aSubj == hu* ] || [ $aSubj == ny* ] ] ]; then
        .
        .
    fi
done
当我尝试运行此命令时,在“if”行上出现语法错误:意外标记“if”附近出现语法错误

有人能指出我哪里出了问题吗?

第一行应该是

for aSubj in /wherever/*; do

如果要提及多个条件,只需将它们嵌套在
()

但是,在这种情况下,您可能需要使用正则表达式,如中所述:

这将检查变量
$aSubj
中的内容是否以
hu
ny
开头

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

for file in ttt/[ab]*

注意:您还可以使用包含正则表达式的with
find
(中的示例):

如果我查找名称以
ca
bc
开头的目录,就会得到这个结果:

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

你对
[
[[
的使用似乎有点随机。每个条件只有一个“[”,但其中一些是嵌套的。你为什么要尝试嵌套它们呢?因为它们是(a)和(b或c),而不是(a&b)或cRight,但是
[
不是那样嵌套的。
[
实际上是一个命令,几乎等同于
test
命令,并且它在参数中不识别
[
。我还有一个问题-变量aSubj最终是整个文件路径(即/where/aSubj)。我如何才能让变量仅仅是目录名?
for file in ttt/[ab]*
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
$ find dirs -mindepth 1 -maxdepth 1 -type d -regex '.*/\(ca\|bc\).*'
dirs/bc23
dirs/ca24