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

时间:2018-02-07 07:38:38

标签: bash search path directory

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

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

我发现了这个细分,但我不确定它是否有用。 $ PATH是一个特殊的变量吗?

1 个答案:

答案 0 :(得分:1)

首先,让我确保我理解正确的问题。你有一些路径(比如" / home / sam / foo / bar / baz")你想测试它是否包含两个特定的目录名称(例如" foo"和&#34 ; 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或{{1} }),并且不要使用#!/usr/bin/env bash命令运行它(它将覆盖shebang)。
  • 比较的工作方式是它看到路径是否匹配模式sh*"/$dir1/"* - 也就是说,它匹配这些名称,每端都有一个斜杠,也许是某些东西之前和之后的其他(*"/$dir2/"*)。但由于路径可能无法以斜线开头和/或结尾,因此我们添加它们(*)以确保它们在那里。
  • 在您的脚本中使用"/$path/"作为变量 - 它是一个非常特殊的变量,告诉shell在哪里可以找到可执行命令。如果您曾经将它用于其他任何事情,您的脚本将突然开始获取"命令未找到"错误。实际上,有一堆全大写的特殊含义变量;为避免与它们发生冲突,请为您的事物使用小写或混合大小写变量。