web-dev-qa-db-ja.com

ケースステートメントは文字列に評価されます

関数型プログラミングのバグを見つけたので、当然、私にとって十分なものはもうありません。 ;)

したがって、bashでは次のように書くことができます。

case $status in
  "foo") status="bar" ;;
  "baz") status="buh" ;;
   *) status=$status ;;
esac

しかし、私はタイプミスが怖いので、私はpreferと書くでしょう:

status=case $status in
  "foo") "bar" ;;
  "baz") "buh" ;;
  *) $status ;;
esac

2番目の形式は、ケースが最後に実行されたコマンドの終了コードに評価されるため無効です。これは、私が探しているものではありません。

私が探していることを達成するための簡単なハックはありますかam

12
mbac32768

ステータスが1行だけになることが確実な場合は、sedを使用して次のようにすることができます。

status=$(echo "$status" | sed -e 's:^foo$:bar:' -e 's:^baz$:buh:')

また、bashに組み込まれている置換を使用して何かを機能させることができる場合もあります。このalmostは機能します(完全に一致する方法だけはわかりません):

status=${status/foo/bar}
status=${status/baz/buh}

あなたの目標が単にもっと「機能的」になることである(そしてあなたのコードをよりタイプミス防止にすることではない)なら、あなたはこれをすることができます:

status=$(
  case "$status" in
    ("foo") echo "bar" ;;
    ("baz") echo "buh" ;;
    (*) echo "$status" ;;
  esac)

正直なところ、bashはおそらく機能を試みるのに最悪の言語の1つです。式を簡単に作成できないという事実に示されているように、bashは実際にはより命令的な考え方で設計されています。 2番目のコードスニペットで、2つの別々のステートメントに分割する必要がある方法を参照してください。 bashが機能するように設計されている場合は、代わりに次のように記述できます。

status=${{status/baz/buh}/foo/bar}

しかし、それはnot動作します。

単純なスクリプトにはbashのみを使用することをお勧めします。より複雑なものには、PythonまたはRubyのようなものを使用します。言語に常に取り組むことなく、より機能的なコードを記述できます。

12
status="baz"
status=$(case $status in
  "foo") echo "bar" ;;
  "baz") echo "buh" ;;
  *) echo $status ;;
esac)
echo "status: $status"

出力

$ ./Shell.sh
status: buh
4
ghostdog74