テーブル名に整数が含まれていることを確認するシェルスクリプトにifループがあります。これが私が指定した条件です。
if [[ "$able_name" == *[0-9]* ]]
通常、テーブル名は次のとおりです。
tablename_000
または
tablename_001
ただし、名前が正規表現と一致するため、このループに入る新しいファイルがありますtable_V2
。これをどのように避けることができますか?if
アンダースコアの後に整数があり、他の文字がない場合にのみループに入る必要があります。
答え1
標準sh
構文を使用してください。
case ${table_name##*_} in
("$table_name" | "" | *[!0-9]*) echo >&2 incorrect;;
(*) echo correct;;
esac
つまり、チェックは$table_name
一番右にあるそれ自体(何も意味しません)でも空の_
文字列でも、数字以外の文字を含むすべてを削除します。$table_name
$table_name
_
文字列を正規表現と一致させる標準コマンドexpr
にはいくつかの問題があり、コードは明確ではありません。
if expr " $table_name" : '.*_[0-9]\{1,\}$' > /dev/null; then
echo Correct
else
echo >&2 Incorrect
fi
先行スペースは、$table_name
like+
またはの値に問題が発生しないようにするためのものです--help
。正規表現は暗黙的に始まり(is .*
)に固定されますが、終わり(is)には固定されず、$
結果(ここでは0または1)が終了状態に反映されることに加えてstdoutに出力されるため、/にリダイレクトされます。開発/ボード。
組み込み合計[
などの一部の実装には演算子があります(EREを使用しますが、次のようにPCREに変更できます)。[
zsh
yash
=~
zsh
if [ "$table_name" '=~' '_[0-9]+$' ]; then
echo Correct
else
echo >&2 Incorrect
fi
bash
、参照の構文と動作は実装ごとに異なりますが、そのzsh
中にksh93
演算子演算子があります。=~
[[...]]
変数を使用する方が良い@BLayerに見られるように
zsh -o extendedglob
and ksh
(bash -O extglob
またはzsh -o kshglob
globサブセットのサポートksh
)は構文は異なりますが、機能的に正規表現と同じglob演算子があります。
翻訳RE - > ksh-glob/zsh-glob:
[0-9]
->[0-9]
/[0-9]
x+
->+(x)
/x##
$
または^
- >暗黙的/暗黙的.
->?
.*
->*
(または*(?)
)/*
(または?#
)
したがってksh
(またはbash -O extglob
またはzsh -o kshglob
)では:
case $table_name in
(*_+([0-9]) echo correct;;
(*) echo >&2 incorrect;;
esac
存在するzsh -o extendedglob
:
case $table_name in
(*_[0-9]##) echo correct;;
(*) echo >&2 incorrect;;
esac
zsh
からの10進数を<x-y>
一致させる拡張glob演算子もあるので、それを書くこともできます。x
y
(*_<->) echo correct
=
これらのシェルでは、これらのglobはaka演算子の右側でも使用できます==
[[...]]
。
答え2
おそらく最も単純な正規表現は次のとおりです。
if [[ "$file" =~ _[0-9]+$ ]]
then
echo OK $file
fi
答え3
これを行う方法はいくつかあります。以下は伝統的な正規表現のBashバージョンです(または少なくともBashが持っているものに最も近いもの):
pattern='^tablename_[[:digit:]]+$'
if [[ $filename =~ $pattern ]]; then
echo "Filename $filename is valid"
fi
いくつかの注意:
- 最も単純な正規表現を除くすべての場合は、ここで使用するように変数を使用することをお勧めします
pattern
。内部式に単語の区切りやパス名の拡張が適用されない場合でも、[[ ]]
チルダ、変数、および算術の拡張とプロセスとコマンドの置換があります。インライン正規表現を使用すると、不正確または予期しない結果が得られます。 - POSIX文字クラスを使用していますが、
[:digit:]
それでも0-9
大丈夫です。ここの他の答えのほとんどは後者を使用すると考え、完全性のために前者を示す価値があります。
コメント:このトピックへのバリエーションが多すぎるという事実(このスレッドのみ)は、sh
一部の人が/ ...が好きではない理由の1つであり、bash
...私が好きな理由の1つです。:)
答え4
これにはregexオプションを使用することをお勧めしますが、数字のみを含む通常のglobも使用できます。たとえば、次の操作を実行できます。
for file in tablename_[0-9]*; do
[ -f "$file" ] || continue
printf "%s\n" "$file"
done
で正規表現演算子を使用すると、bash
次のことができます。
for file in tablename_*; do
if [[ $file =~ _([[:digit:]]+)$ ]]; then
printf "%s\n" "$file"
fi
done