シェル変数に絶対パスが含まれていることを確認してください。

シェル変数に絶対パスが含まれていることを確認してください。

シェル変数に絶対パスが含まれていることを確認したいと思います。

パスが存在するかどうかは関係ありません。存在しない場合はパスを生成します。しかし、絶対パス名を扱っていることを確認したいと思います。

私のコードは次のとおりです

myfunction() {
  [ magic test to see if "$1" is an absolute path ] || return 1
  mkdir -p "$(dirname "$1")" || return 1
  commands >> "$1"
}

または、確認する絶対パスがディレクトリであるユースケース:

anotherfunction() {
  [ same magic test ] || return 1
  mkdir -p "$1"
  dostuff >> "$1/somefile"
}

それでは、awk次のように確認してみましょう。myvar ~ /^\//

そこ〜しなければならないシェルの文字列処理でこれを行うのはきちんとした方法ですが、それを見つけるのに問題があります。

bash特定の解決策に言及するのは良いことですが、移植可能な方法も知りたいです。POSIX文字列の処理で十分です。)

答え1

次のことができます。

case $1 in (/*) pathchk -- "$1";; (*) ! : ;; esac

それだけで十分です。診断情報をstderrに記録し、アクセスできない、または生成できないコンポーネントのエラーを返します。pathchkについてではありません既存のパス名 - これについて書くことができるパス名。

このpathchkユーティリティは、1つ以上のパス名が有効であることを確認する必要があります。(つまり、構文エラーなしでファイルにアクセスまたは生成するために使用できます)そしてポータブル(つまり、ファイル名の切り捨て結果はありません)。この-pオプションは、より広範な移植性チェックを提供します。

デフォルトでは、pathchkユーティリティはすべてのコンポーネントを確認する必要があります。pathname基本ファイルシステムに基づくオペランドです。診断書はそれぞれに作成する必要があります。pathnameオペランド:

  • {PATH_MAX}バイトより長い(パス名変数値参照 <制限事項.h>)

  • {NAME_MAX}バイトより長いコンポーネントが配置されているディレクトリに含まれています。

  • ディレクトリには、検索できないコンポーネントが含まれています。

  • すべてのコンポーネントには、含まれているディレクトリに無効な文字が含まれています。

診断メッセージの形式は指定されていませんが、検出されたエラーとそのエラーを表示する必要があります。pathnameオペランド。

コンポーネントの1つ以上のコンポーネントをエラーと見なすべきではない場合pathnameファイルが一致する限り、オペランドは存在しません。pathname上記のチェックに違反しない、欠落しているコンポーネントで指定されたコンポーネントを作成できます。

答え2

[ "$1" != "${1#/}" ] || return 1

おそらくもっと良い方法があるでしょう(だから私が尋ねることです)。このコードはすべての先行を削除し/$1結果が次のようになることを確認します。いいえそれ自体のように$1

答え3

パターンマッチングは、caseすべてのBourne様シェルのステートメントを通して行われます。

is_absolute() {
  ケース '$1'
    ///* | //)事実;;
          //*)無効です;; #一部のシステムでは //foo が特別です。そして
                       #絶対パスではありません。 //唯一のこと/
           /*)本物;;
            *) 無効
  イサク
}

特別な処理なしでシステムの最初の2つの項目を削除します//foo

答え4

合格すると絶対パスで始まるという意味です。私たちは(ラベルが示すように)次のように/議論しています。bash

$ var1='/tmp/foo'
$ var2='tmp/foo'

$ [[ "$var1" =~ ^/ ]] && echo yes || echo no
yes
$ [[ "$var2" =~ ^/ ]] && echo yes || echo no
no

関連情報