2017-01-03 7 views
2

私はいつもパラメータを使ってシェルスクリプトを開発しました。これは、日常的に、あるいはいくつかの自動化スクリプトを開発しているときでもあります。しかし、最近私はスクリプトに環境変数をエクスポートする別のアプローチを試みました。パラメータを使用するか、環境変数をエクスポートする必要がありますか?

#!/bin/bash 

: ${USER?"Requires USER"} 
: ${FIRST_NAME?"Requires FIRST_NAME"} 
: ${LAST_NAME?"Requires LAST_NAME"} 
: ${EMAIL?"Requires EMAIL"} 

set -x 

setup_git_account(){ 
    su - "${USER}" -c "git config --global user.name '${FIRST_NAME} ${LAST_NAME}'" 
    su - "${USER}" -c "git config --global user.email '${EMAIL}'" 
} 

setup_git_account 

これは、小さなコードを保証し、必要なすべての変数が初期化され、また、スクリプトが何をしているかをよりよく理解するには、いったんすべての変数が外に宣言されている場合は簡単にチェック。

パラメータを受信して​​実装されている場合、次のように表すことができる
export USER='john' && export FIRST_NAME='John' && export LAST_NAME='Doe' && export EMAIL='[email protected]' && setup_git_account.sh 

setup_git_account.sh --user 'john' --firstname 'John' --lastname 'Doe' --email '[email protected]' 

しかし、最後の1は、渡されたパラメータをチェックし、getoptsスイッチケースを実装するコードの方法より多くの行が必要になります値など。

とにかく、私は2番目のアプローチに慣れていることを知っていますが、私は最初のアプローチにもいくつかの利点があると思います。提示されたアプローチの間に不利な点がある場合、私はあなたからもっと多くのことを聞きたいと思います。そして、どちらを使うべきですか?

ありがとうございます!

+3

環境変数を使用すると、すべてが明示的に設定されていないと予期しない動作が発生する可能性が高くなります。これらはシステム、あなたのbashrc、前に実行したスクリプトなどによって(偶然に)設定できます。 – hasufell

+1

パラメータの使用をお勧めします – hek2mgl

+1

小文字の変数名を使用してください。特に 'USER'は既に使用されていて、あなたの環境に既に*設定されています。 – chepner

答えて

1

いずれもオプションではありません。私は位置パラメータを使うだけです。

: ${1?"Requires USER"} 
: ${2?"Requires FIRST_NAME"} 
: ${3?"Requires LAST_NAME"} 
: ${4?"Requires EMAIL"} 

sudo -u "$1" git config --global user.name "$2 $3" user.email "$4" 

ユーザーが任意の順序で値を指定する方法を提供することは、単なる不要な複雑さです。

あなたは、単に最初と最後の名前は別々の引数する必要があるかどうかを再考

setup_git_account.sh 'john' 'John' 'Doe' '[email protected]' 

でスクリプトを呼び出します。とにかくそれらはスクリプトによってgit configへの単一の引数に結合されます。その名前を一つの引数として取るだけです。

setup_git_account.sh 'john' 'John Doe' '[email protected]' 

(必要に応じてスクリプトを適宜変更します)。

+0

完璧!ご回答どうもありがとうございました! –

0

私は決してあなたのアプローチを使用しません。私は、パラメータを使うことによって欠点がないと思う。パラメータを使用する一般的な方法であり、longoptsを使用している場合は自己記述的です。 私の意見では、異なるスクリプトでデータが必要な場合、env varsは解決策です。

環境を変更できないシステムでこのようなスクリプトを実行するのに問題があるかもしれません。

2

ビットオフトピック、bashの環境変数と呼び出し構文を短くすることができ、何export年代の必要性:自分の価値観の

USER='john' FIRST_NAME='John' LAST_NAME='Doe' EMAIL='[email protected]' setup_git_account.sh 
+0

これは良い答えです。 environment-variables-vs-parametersの問題は少し意見に基づいていますが、これは環境変数が使用されている場合にスクリプトを呼び出す正しい方法です。 – chepner

0

guideを使用して変数をパラメータ化しました。私はしばらく前に書きましたが、さらに--helpを追加しました。私はあなたのローカル環境との競合を避けるために、$USER_NAME$USERを変更

while getopts e:f:hl:u:-: arg; do 
    case "$arg" in 
    e) EMAIL="$OPTARG" ;; 
    f) FIRST_NAME="$OPTARG" ;; 
    h) do_help ;; 
    l) LAST_NAME="$OPTARG" ;; 
    u) USER_NAME="$OPTARG" ;; 
    -) LONG_OPTARG="${OPTARG#*=}" 
     case $OPTARG in 
      email=?*) EMAIL="$LONG_OPTARG" ;; 
      first*=?*) FIRST_NAME="$LONG_OPTARG" ;; 
      help*)  do_help ;; 
      last*=?*) LAST_NAME="$LONG_OPTARG" ;; 
      user=?*) USER_NAME="$LONG_OPTARG" ;; 
      *) echo "Illegal option/missing argument: --$OPTARG" >&2; exit 2 ;; 
     esac ;; 
    *) exit 2 ;; # error messages for short options already given by getopts 
    esac 
done 
shift $((OPTIND-1)) 

HELP=" - see ${0##*/} --help" 
: ${USER_NAME?"Requires USER_NAME$HELP"} 
: ${FIRST_NAME?"Requires FIRST_NAME$HELP"} 
: ${LAST_NAME?"Requires LAST_NAME$HELP"} 
: ${EMAIL?"Requires EMAIL$HELP"} 

su - "$USER_NAME" -c "git config --global user.name '$FIRST_NAME $LAST_NAME'" 
su - "$USER_NAME" -c "git config --global user.email '$EMAIL'" 

注意($USERあなたユーザー名です:

このソリューションでは、環境変数と同様に(切り札変数を意志)のオプションを受け付けます!

FULL_NAME="$(getent passwd |awk -v u="$USER_NAME" -F: '$1 == u { print $5 }')" 
:ローカルのLinuxシステム上で)

また、システムからユーザのフルネームを抽出することができます

(FIRST_NAMEとLAST_NAMEを分ける理由はありません。あなたはJean Claude Van Dammeのために何をしていますか?彼らはとにかく一緒に使用されています。

これは、do_helpを使用して、出力が--helpであることを示しています。これはどのように見えるのかの例です(私はこれをスクリプトの様々な部分に置いて、読んでいる人だけが概要を得ることができるようにしています;上記のコードブロックにないのは、ブロックがスクロールバー):

do_help() { cat <</help 
Usage: ${0##*/} [OPTIONS] 
    -u USER_NAME, --user=USER_NAME 
    -f FIRST_NAME, --firstname=FIRST_NAME 
    -l LAST_NAME, --lastname=LAST_NAME 
    -e EMAIL,  --email=EMAIL 
Each option may also be passed through the environment as e.g. $EMAIL 

Code taken from https://stackoverflow.com/a/41515444/519360 
/help 
} 
関連する問題