私はシェルスクリプトに初めて触れました。条件付きで変数を割り当てる簡単なスクリプトを作成しました。
#!/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
、ある言語で動作することが他の言語でも機能することは期待できません。
sh
1つ目はコマンドラインソルバーです。ほとんどの操作は、シェルから呼び出されたコマンドを介して行われます。
[
たとえば、条件付きテストを評価するためにakaという専用コマンドがありますtest
。 //if
は構文構造ですが、そのthen
動作は、および間のコマンドリストの成功または失敗によって異なります。fi
sh
if
then
変数の内容をコマンドに渡すには構文が必要です$var
。コマンドにecho foo
渡された場合は、変数の内容を(重要な引用符に注意してください(でもfoo
echo
echo "$foo"
$foo
echo
[
コマンドの場合は重要)sh
不幸なバグ機能を解決するため)。
sh
サブシェルを実行してその中のコードが(...)
別の環境(ほとんどの実装sh
ではサブプロセス)で解釈され、my_env=="dev"
同じ 1 が変数に割り当てられると正常に実行されるので、サブシェルも同様です。成功すると、その部分が実行されます。my_env="=dev"
=dev
$my_env
then
正しい構文は次のとおりです。
#!/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
に似た)設定を使用する方が良いです。C
switch
#! /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==dev
or my_env='='"d"e\v
、しかしmy_env'==dev'
norではない$my_dev==dev
、重要な部分は、最初のものが=
リテラル、引用符がなく、残りはリテラル、引用符がなく、有効な変数名であることです。変数の割り当て順序で考えてください。というコマンドmy_env'==dev'
を実行しようとしましたmy_env==dev
が、見つからない可能性があります。