テーブル名に整数が含まれていることを確認するシェルスクリプトに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演算子の右側でも使用できます==
[[...]]
。