例えば。 $PWD
は/ homeのサブディレクトリです。つまり、ある文字列が別の文字列で始まるかどうかを確認するために、bash文字列操作を検索しています。
ディレクトリが別のディレクトリのサブディレクトリであるかどうかを確実にテストする場合は、文字列のプレフィックスチェックだけでは不十分です。 Gillesの回答は、このテストを適切に行う方法を詳しく説明しています。
しかし、単純な文字列のプレフィックスチェックが必要な場合(おそらく、パスを既に正規化しているのでしょうか?)、これは良い方法です。
test "${PWD##/home/}" != "${PWD}"
$PWD
は「/ home /」で始まり、左側で削除されます。つまり、右側と一致しないため、「!=」はtrueを返します。
任意のボーンスタイルシェルで、文字列が別の文字のプレフィックスであるかどうかをテストするには:
case $PWD/ in
/home/*) echo "home sweet home";;
*) echo "away from home";;
esac
同じ原則が、サフィックステストまたはサブストリングテストでも機能します。 case
構文では、ファイル名とは異なり、*
は/
または最初の.
を含むすべての文字に一致することに注意してください。
[[ … ]]
構文を実装するシェル(bash、ksh、zshなど)では、文字列をパターンと照合するために使用できます。 ([
コマンドは文字列が等しいかどうかのみテストできることに注意してください。)
if [[ $PWD/ = /home/* ]]; then …
現在のディレクトリが/home
の下にあるかどうかを具体的にテストする場合、シンボリックリンクのため、単純な部分文字列テストでは十分ではありません。
/home
が独自のファイルシステムである場合は、現在のディレクトリ(.
)がそのファイルシステム上にあるかどうかをテストします。
if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
echo 'The current directory is on the /home filesystem'
fi
NetBSD、OpenBSD、またはGNU(つまりLinux)readlink
を使用している場合は、readlink -f
を使用してパスからシンボリックリンクを削除できます。
case $(readlink -f .)/ in $(readlink -f /home)/*) …
それ以外の場合は、pwd
を使用して現在のディレクトリを表示できます。ただし、シェルがcd
コマンドを追跡し、「実際の」場所ではなくディレクトリに到達するために使用した名前を保持している場合は、組み込みのシェルを使用しないように注意する必要があります。
case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
"$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …
原油バージョン:
[ ${PWD:0:6} = "/home/" ]
最初に文字を数える必要があり、/home/
を$1
のような一般的なものに置き換えることができないという欠点があります。
編集(@Michaelに感謝)汎化を$VAR
と比較して使用できる
[ "${PWD:0:${#VAR}}" = $VAR ]
私は質問をあまり理解していませんが、$ PWDの親を見つけるには、_dirname $PWD
_を実行します。親の親を見つけるには、dirname $(dirname $PWD)
などを実行します...
awk
の使用:
echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'
うーん、残念です[
にはテストするオプションがありませんSTRING1 starts with STRING2
状態。
echo $PWD | grep '^$VAR'
ですが、VAR
に特殊記号が含まれていると、興味深い方法で失敗する可能性があります。
awk
のindex
関数がトリックを実行できるはずです。しかし、これはすべて、テストするのが簡単なほど重すぎるようです。
パスの検索部分が見つかった場合、変数を「空」にします。
[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"