簡潔明了:如何使用 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 個預定義檔案夾
uj5u.com熱心網友回復:
這種方法有問題。
例如,在 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。將變數大寫有點危險。
uj5u.com熱心網友回復:
試試這個(幾乎)Shellcheck -clean 代碼:
#! /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
- 由于別名機制(例如符號鏈接、系結掛載),通常很難通過文本比較來確定兩個路徑是否參考同一個檔案或目錄。請參閱如何檢查 Bash 中的兩條路徑是否相等?了解更多資訊。此解決方案使用更可靠的機制來確定當前目錄是否為有效目錄之一。
- 由于 shebang 行參考
sh而不是bash,因此代碼避免了 Bashisms。它已經過測驗bash和dash(可能是最常見的非 Bashsh)。 - 有關代碼不使用 ALL_UPPERCASE 變數名稱的原因,請參閱正確的 Bash 和 shell 腳本變數大寫。
- 如果被檢查的路徑與當前目錄是同一目錄,則
[ "$phpath" -ef . ]測驗為真。.../public_html該-ef運算子不在 POSIX 中,因此不能保證shshell 支持它,并且Shellcheck(正確)會發出警告。bash但是,它在和中都受支持dash,并且sh通常是其中之一(至少在 Linux 上)。
uj5u.com熱心網友回復:
您可以通過更改目錄而不是檢查來保存步驟。
首先檢查你的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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/476676.html
下一篇:docker腳本中的貓
