Bash '上的多个条件;如果';
我试图编写一个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”附近出现语法错误 有人能指出我哪里出了问题吗?第一行应
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