たとえば$PWD
、/ homeのサブディレクトリであるかどうかを確認します。つまり、ある文字列が別の文字列で始まるかどうかを確認するために、bash文字列操作を検索しています。
たとえば$PWD
、/ homeのサブディレクトリであるかどうかを確認します。つまり、ある文字列が別の文字列で始まるかどうかを確認するために、bash文字列操作を検索しています。
回答:
ディレクトリが別のディレクトリのサブディレクトリであるかどうかを確実にテストする場合は、単なる文字列プレフィックスチェック以上のものが必要になります。Gillesの回答では、このテストを適切に行う方法について詳しく説明しています。
ただし、単純な文字列プレフィックスチェックが必要な場合(パスを既に正規化している場合がありますか?)、これは良い方法です。
test "${PWD##/home/}" != "${PWD}"
$PWD
「/ home /」で始まる場合、左側で削除されます。つまり、右側と一致しないため、「!=」はtrueを返します。
${PWD/#$HOME/\~}
"${PWD%%/subdir*}"
するため、ユーザーが現在subdir
のサブディレクトリにいるか、サブディレクトリにいるかを検出するために使用しますsubdir
。これは、パラメータの置換に関する詳細情報を探している人にとって有用です:tldp.org/LDP/abs/html/parameter-substitution.html
Bourneスタイルのシェルで、文字列が別の文字列のプレフィックスかどうかをテストするには:
case $PWD/ in
/home/*) echo "home sweet home";;
*) echo "away from home";;
esac
同じ原則が接尾辞または部分文字列のテストにも機能します。case
構文では、ファイル名とは異なり、*
a /
やinitial を含む任意の文字に一致することに注意してください.
。
[[ … ]]
構文(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
1缶使用
[ "${PWD:0:${#VAR}}" = $VAR ]
${#var}
長さである$var
、あなたのようにそれを一般化することができますので、[ "${PWD:0:${#1}}" = "$1" ]
を使用してawk
:
echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'
パスの検索された部分が見つかった場合、変数を「空にする」:
[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
[ "${PWD##$VAR}" != "$PWD" ]
そしてより一般的な場合:そして、これが[code-golf](stackoverflow.com/questions/tagged/code-golf)の質問であれば、2文字で私をbeatられたでしょう;-)より読みやすい...