変数に条件付きで値を割り当てることは機能しません。

変数に条件付きで値を割り当てることは機能しません。

私はシェルスクリプトに初めて触れました。条件付きで変数を割り当てる簡単なスクリプトを作成しました。

#!/bin/sh

my_env=$1

if (my_env=="dev"); then
  MY_TYPE="dev type"
elif (my_env=="stg"); then
  MY_TYPE="stg type"
elif (my_env=="prod"); then
  MY_TYPE="prod type"
fi
echo $MY_TYPE

私がそれを実行したとき:

$shell ./my_script.sh dev

それは印刷されます: dev type、これは正しいです。

その後、もう一度実行してください。

$shell ./my_script.sh stg

また出力されますdev type。なぜ印刷できないのですstg typeか? ?私の条件付きロジックにはどのような問題がありますか?

答え1

言語は言語でshはなくC、ある言語で動作することが他の言語でも機能することは期待できません。

sh1つ目はコマンドラインソルバーです。ほとんどの操作は、シェルから呼び出されたコマンドを介して行われます。

[たとえば、条件付きテストを評価するためにakaという専用コマンドがありますtest。 //ifは構文構造ですが、そのthen動作は、および間のコマンドリストの成功または失敗によって異なります。fishifthen

変数の内容をコマンドに渡すには構文が必要です$var。コマンドにecho foo渡された場合は、変数の内容を(重要な引用符に注意してください(でもfooechoecho "$foo"$fooecho[コマンドの場合は重要sh不幸なバグ機能を解決するため)。

shサブシェルを実行してその中のコードが(...)別の環境(ほとんどの実装shではサブプロセス)で解釈され、my_env=="dev"同じ 1 が変数に割り当てられると正常に実行されるので、サブシェルも同様です。成功すると、その部分が実行されます。my_env="=dev"=dev$my_envthen

正しい構文は次のとおりです。

#!/bin/sh -

my_env="$1"

if [ "$my_env" = dev ]; then
  MY_TYPE="dev type"
elif [ "$my_env" = stg ]; then
  MY_TYPE="stg type"
elif [ "$my_env" = prod ]; then
  MY_TYPE="prod type"
fi
printf '%s\n' "$MY_TYPE"

ここでは(scaseに似た)設定を使用する方が良いです。Cswitch

#! /bin/sh -
my_env=${1?Missing type argument}

case $my_env in
  (dev | stg | prod)
    MY_TYPE="$my_env type"
    ;;
  (*)
    printf >&2 '%s\n' "Unsupported type: $my_env"
    exit 1
esac

printf 'MY_TYPE = %s\n' "$MY_TYPE"

$my_envまた、許可されたセットにない場合に失敗した終了状態で終了する包括的な方法を参照して、$MY_TYPE以下で初期化されていない使用を避け、${1?error}スクリプトに少なくとも1つの引数が渡されたことを確認し、そうでない場合はユーザーにエラーを報告する簡単な方法として。


¹ or my_env='=dev'or my_env==devor my_env='='"d"e\v、しかしmy_env'==dev'norではない$my_dev==dev、重要な部分は、最初のものが=リテラル、引用符がなく、残りはリテラル、引用符がなく、有効な変数名であることです。変数の割り当て順序で考えてください。というコマンドmy_env'==dev'を実行しようとしましたmy_env==devが、見つからない可能性があります。

関連情報