Bash 检查当前文件夹路径部分的脚本

Bash script that checks for parts of current folderpath

简洁明了:如何使用 bash 检查我当前所在文件夹的某些部分?

#!/usr/bin/sh
CURRENTFOLDER=$(pwd)
echo "${CURRENTFOLDER}"
CHECKFOLDER="/home/*/domains/*/public_html"
if [ $CURRENTFOLDER ! $CHECKFOLDER ]
then
echo "Current folder is not /home/user/domains/domain.com/public_html"
exit
fi

用户和域是可变的,我不需要为这次检查知道它们,只需变量 CHECKFOLDER 中的 3 个预定义文件夹

这种方法有问题。
例如,在 bash 中,以下表达式的计算结果为 true:

[[ /www/user/domains/local/public_html == /www/*/public_html ]] 

使用 bash 正则表达式更准确:

[[ /www/user/domains/local/public_html =~ ^/www/[^/]+/public_html$ ]]

因此您的代码将变为:

#!/bin/bash

current_folder=$PWD
check_folder='^/home/[^/]+/domains/[^/]+/public_html$'

if ! [[ $current_folder =~ $check_folder ]]
then
    echo "Current folder is not /home/user/domains/domain.com/public_html"
    exit
fi

顺便说一句,shebang 必须是 bash,而不是 sh。将变量大写有点危险。

您只需切换到目录而不是检查即可节省一个步骤。

首先检查您的 glob 只匹配一个文件。

然后,cd检查它是一个目录。

#! /bin/bash

IFS="$(printf '\n\t')"
files=( $(compgen -G '/home/*/domains/*/public_html') )
if [[ "${#files[@]}" != 1 ]]
then
    printf 'Multiple matches\n' >&2
    exit 1
fi
if ! cd "${files[0]}" 
then
   printf 'Cannot chdir\n'
   exit 1
fi

试试这个(几乎)Shellcheck-干净的代码:

#! /usr/bin/sh

curr_phpath=''
for phpath in /home/*/domains/*/public_html/; do
    if [ "$phpath" -ef . ]; then
        curr_phpath=$phpath
        break
    fi
done

if [ -z "$curr_phpath" ]; then
    echo "Current folder is not /home/user/domains/domain.com/public_html" >&2
    exit 1
fi
  • 由于别名机制(例如符号链接、绑定挂载),通常很难通过文本比较来确定两个路径是否引用相同的文件或目录。有关详细信息,请参阅 。此解决方案使用更可靠的机制来确定当前目录是否是有效目录之一。
  • 由于 shebang 行引用 sh 而不是 bash,代码避免了 Bashisms。它已经过 bashdash 测试(可能是最常见的 non-Bash sh)。
  • 有关代码为何不使用 ALL_UPPERCASE 变量名称的解释,请参阅 Correct Bash and shell script variable capitalization
  • 如果被检查的 .../public_html 路径与当前目录是同一目录,则 [ "$phpath" -ef . ] 测试为真。 -ef 运算符不在 POSIX 中,因此不能保证 sh shell 支持它,并且 Shellcheck(正确地)对此发出警告。但是,bashdash 都支持它,而 sh 通常是其中之一(至少在 Linux 上)。