私は次のbashscriptを持っています:
function get_cms {
echo "input cms name"
read cms
cms=${cms,,}
if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
get_cms
fi
}
しかし、私が何を入力しても(正しい値と間違った値)、これらの3つの入力のうち1つだけを許可したいので、それは関数を再び呼び出しません。 ||で試しました[ var != value ] or [ var != value1 ] or [ var != value1 ]
を使用しますが、何も機能しません。誰かが私を正しい方向に向けることができますか?
言う代わりに:
if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
いう:
if [[ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]]; then
Conditional Constructs を参照することもできます。
主な目的が、指定された値がリストにないかどうかを確認することである場合、「equal tilde」演算子を介してBASHに組み込まれた拡張正規表現マッチングを使用できます( this answer も参照) :
if ! [[ "$cms" =~ ^(wordpress|meganto|typo3)$ ]]; then get_cms ; fi
ごきげんよう
そのようなリストにはcase
を使用する方が良いでしょう:
case "$cms" in
wordpress|meganto|typo3)
do_your_else_case
;;
*)
do_your_then_case
;;
esac
長いリストの場合、これは読みやすいと思います。
それでもif
を好む場合は、次の2つの方法で単一の括弧でそれを行うことができます。
if [ "$cms" != wordpress -a "$cms" != meganto -a "$cms" != typo3 ]; then
または
if [ "$cms" != wordpress ] && [ "$cms" != meganto ] && [ "$cms" != typo3 ]; then
これが私の解決策です
if [[ "${cms}" != +(wordpress|magento|typo3) ]]; then