2011-01-20 3 views
1

誰かがKSH if、case、またはloop文でグローバルスコープの変数を設定する方法を知っていますか?KSH if文またはcase文で変数をどのように変更しますか?

私は次のコードを実行しようとしていますが、スクリプトは入力ファイルに表示されている実際の値の代わりにエコーの "H"だけを出力します。

CFG_DIR=${WORK_DIR}/cfg 
CFG_FILE=${CFG_DIR}/$1 
NAME=$(echo $CFG_FILE | cut -f1 -d\.) 

UPPER_BUS_NETWORK="H" 

cat ${CFG_FILE} | grep -v ^\# | 
while read CLINE 
do 
    PROPERTY=$(echo $CLINE | cut -f1 -d\=) 
    VALUE=$(echo $CLINE | cut -f2 -d\=) 

    if [ ${PROPERTY} = "UpperBusService" ]; then 
     UPPER_BUS_SERVICE="${VALUE}" 
    fi 
    if [ ${PROPERTY} = "UpperBusNetwork" ]; then 
     UPPER_BUS_NETWORK="${VALUE}" 
    fi 
done 

echo ${UPPER_BUS_NETWORK} 

答えて

0

本当にkshで実行していますか?どのバージョン? Ksh93はwhileループ内にサブシェルを設定しません。バッシュ、ダッシュ、灰、pdkshですが、私はksh88についてはわかりません。

はZshのはは、ksh93と同じ結果を与える

ksh -c 'a=111; echo foo | while read bar; do echo $a; a=222; echo $a; done; echo "after: $a"' 
111 
222 
after: 222 

$ bash -c 'a=111; echo foo | while read bar; do echo $a; a=222; echo $a; done; echo "after: $a"' 
111 
222 
after: 111 

を比較します。

残念ながら、pdkshはプロセス置換をサポートしておらず、ksh93は処理しますが、whileループのdoneにリダイレクトされていないため、Bashで動作する通常のソリューションは利用できません。

command > tmpfile 
while read 
do 
    ... 
done < tmpfile 

いくつかの追加の注意事項:唯一の解決策かもしれ一時ファイルを使用して

# Bash (or Zsh) 
while read ... 
do 
    ... 
done < <(command) 

:これは、それがどのように見えるかです

  • 代わりのcat ${CFG_FILE} | grep -v ^\#を行うgrep -v ^\# "${CFG_FILE}"
  • 通常、read -rを使用して、バックスラッシュを文字通り処理します。
  • 0123代わりに NAME=$(echo $CFG_FILE | cut -f1 -d\.)
  • あなたは、私が使用しての習慣をお勧めしますであなたのecho文とあなたのcatコマンド
  • の各
  • NAME=${CFG_FILE%%.*}様および VALUE=${#*=}; VALUE=${VALUE%%=*}変数は、通常、例えば、出力に上場されなければならない何かを行うことができるはず小文字または大文字と小文字の両方の変数名を使用して、シェル変数との競合を回避します(投稿されたコードには何もありません)。
関連する問題