web-dev-qa-db-ja.com

BashまたはUNIXシェルで文字列の最初の文字を確認する方法は?

私は、文字列の最初の文字が「/」であるかどうかを確認する必要があるUNIXでスクリプトを作成しています。

たとえば、私は文字列を持っています:

/some/directory/file

私はこれに1を返し、そして:

[email protected]:/some/directory/file

0を返します。

60
canecse

これを行う多くの方法。二重括弧でワイルドカードを使用できます。

str="/some/directory/file"
if [[ $str == /* ]]; then echo 1; else echo 0; fi

部分文字列展開を使用できます。

if [[ ${str:0:1} == "/" ]] ; then echo 1; else echo 0; fi

または正規表現:

if [[ $str =~ ^/ ]]; then echo 1; else echo 0; fi
111
user000001

ほとんどのshベースのシェルと互換性のあるcaseステートメントも考慮してください。

case "$STRING" in
/*)
    echo 1
    ;;
*)
    echo 0
    ;;
esac
14
konsolebox
$ foo="/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
1
$ foo="[email protected]:/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
0
9
devnull

cut -c1

これはPOSIXであり、 case とは異なり、実際に最初の文字を後で必要に応じて抽出します。

myvar=abc
first_char="$(printf '%s' "$myvar" | cut -c1)"
if [ "$first_char" = a ]; then
  echo 'starts with a'
else
  echo 'does not start with a'
fi

awk substrは別のPOSIXですが、あまり効率的ではありません。

printf '%s' "$myvar" | awk '{print substr ($0, 0, 1)}'

printf '%s'は、エスケープ文字の問題を回避するためです: https://stackoverflow.com/a/40423558/895245 例:

myvar='\n'
printf '%s' "$myvar" | cut -c1

期待どおり\を出力します。

${::}はPOSIXではないようです。

参照: シェルスクリプトで文字列の最初の2文字を抽出する方法?