Bash检查路径是否包含两个文件夹

Bash检查路径是否包含两个文件夹,bash,search,path,directory,Bash,Search,Path,Directory,如何搜索任意路径并确定它是否有两个文件夹名?文件夹名称可以按任意顺序出现在任何位置。不是贝壳专家,所以在这里寻求帮助 if [ -p "$PATH" ]; then echo "path is set" else echo "path is not set" fi 我找到了这个片段,但我不确定它是否有用$PATH是一个特殊变量,对吗?首先,让我确定我正确理解了这个问题。您有一些类似于/home/sam/foo/bar/baz的路径,您想测试它是否包含两个特定的目录名,例如foo和bar

如何搜索任意路径并确定它是否有两个文件夹名?文件夹名称可以按任意顺序出现在任何位置。不是贝壳专家,所以在这里寻求帮助

if [ -p "$PATH" ]; then
  echo "path is set"
else
  echo "path is not set"
fi

我找到了这个片段,但我不确定它是否有用$PATH是一个特殊变量,对吗?

首先,让我确定我正确理解了这个问题。您有一些类似于/home/sam/foo/bar/baz的路径,您想测试它是否包含两个特定的目录名,例如foo和bar,顺序都是这样,对吗?所以,寻找foo和bar:

/home/sam/foo/bar/baz会匹配 /mnt/bar/subdir/foo也会匹配 /mnt/bar/foo2不匹配,因为foo2不是foo 如果这是正确的,您可以在bash中作为两个测试来执行此操作:

dir1="foo"
dir2="bar"
if [[ "/$path/" = *"/$dir1/"* && "/$path/" = *"/$dir2/"* ]]; then
    echo "$path" contains both $dir1 and $dir2"
else
    echo "$path" does not contain both $dir1 and $dir2"
fi
注:

这是使用[[]条件表达式,它不同于[],在基本shell中不可用。如果使用这种类型的表达式,则需要使用shebang来启动shell脚本,告诉操作系统使用bash运行它,而不是通用shell,即第一行也应该是/bin/bash或/usr/bin/env bash,不要使用sh命令运行它,该命令将覆盖shebang。 比较的工作方式是,它查看路径是否同时匹配模式*/$dir1/*和*/$dir2/*——也就是说,它匹配这些名称,每端都有一个斜杠,可能前后都有其他的*符号。但是由于路径可能不会以斜杠开始和/或结束,因此我们添加它们/$path/以确保它们在那里。 不要在脚本中使用PATH作为变量-它是一个非常特殊的变量,告诉shell在哪里可以找到可执行命令。如果您将其用于任何其他用途,您的脚本将突然开始出现command not found错误。事实上,有一堆特殊意义的变量;为避免与它们发生冲突,请使用小写或大小写混合的变量。
您的意思是文件夹必须正好包含2个子文件夹吗?