0

データベースからレコードセットを取得しているUbuntu bashのサイクルで変数を設定しようとしていますが、この変数は以前の値に設定されています。コードは次のとおりです。

#!/bin/bash
PREV_FILE_PATH="127"

while true
do
    echo "$PREV_FILE_PATH"
    mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME --skip-column-names --default-character-set=UTF8  -e "here is a query" | while read "here is getting variables from recordset";

    do

    PREV_FILE_PATH="777"

    done

done

そして、このコードは毎回出力します:

127 127 127

しかし、私はこのブロックを置き換えました-:

mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME --skip-column-names --default-character-set=UTF8 -e "here is a query" | while read "here is getting variables from recordset";

サイクルの最後にjustwhile trueと break を使用すると、正常に動作し、次のように出力されます。

127 777 777 777

スクリプトはいくつかのサブシェルを作成し、そのサブシェルでその MySQL クエリを実行します。では、スクリプトでその変数を変更するにはどうすればよいでしょうか?

4

1 に答える 1

1

mysqlご指摘のとおり、この問題は、コマンドの出力をwhileループにパイプすることによって引き起こされるサブシェルの作成によるものです。簡単な例:

PREV_FILE_PATH=127
echo test | while read _; do
   PREV_FILE_PATH=777
done
echo $PREV_FILE_PATH
# output: 127

BASH を使用しているため、mysqlコマンドをパイプから、STDIN redirectionを介してループに供給される置換プロセスに移動できます。前の簡単な例を使用します。while

PREV_FILE_PATH=127
while read _; do
   PREV_FILE_PATH=777
done < <(echo test)
echo $PREV_FILE_PATH
# output: 777

したがって、コードを修正するには、上記mysqlのコマンドを移動したのと同じ方法でコマンドを移動する必要があります。echo

while read "here is getting variables from recordset"
do
   PREV_FILE_PATH="777"
done < <(mysql -h$DB_HOST -u $DB_USER [..remaining options..])

プロセス置換 via<()は BASH 主義であり、POSIX に準拠していないことに注意してください。

于 2013-10-03T04:15:11.303 に答える