Home > Net >  Bash script that checks for parts of current folderpath
Bash script that checks for parts of current folderpath

Time:05-18

Clean and simple: how do I check with bash for certain parts of the folder I'm currently in?

#!/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

User and domain are variable, I don't need to know them for this checkup, just the 3 pre-defined folders in the variable CHECKFOLDER

CodePudding user response:

There's a problem with this approach.
For example in bash the following expression evaluates to true:

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

It is more accurate to use a bash regex:

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

So your code would become:

#!/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

BTW, the shebang needs to be a bash, not sh. And it's kind of dangerous to capitalize your variables.

CodePudding user response:

You can save a step just by changing to the directory instead of checking.

Check your glob matches only one file first.

Then, cd to check it's a dir.

#! /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
  • Related