ループにレコードを追加するには?

ループにレコードを追加するには?

次のループの出力を別のループの下に追加したいのですが、出力ファイルでは "abc3"の結果のみを取得します。

以下のスクリプトが見つかりました。変更について教えてください。よろしくお願いします。

for i in abc1 abc2 abc3
do
SELECT_QUERY_1="select substring('$i',4,len('$i')-7) as Table_Name,COLUMN_NAME,ORDINAL_POSITION,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = '$i'  and ORDINAL_POSITION <= (select max(ORDINAL_POSITION)-4 from INFORMATION_SCHEMA.COLUMNS where table_name = '$i')"

echo -e `/opt/mssql-tools/bin/sqlcmd -S server_name -U username -P user -d db -Q "$SELECT_QUERY_1"  -o "out.txt"`
sed "s/^[ \t]*//" -i out.txt

mv out.txt /home/results/out.txt

done

答え1

パスの変更 mv out.txt /home/results/out.txt

到着

cat out.txt >> /home/results/out.txt

3つの結果をすべて1つのファイルに入れます。このコマンドを使用すると、mv毎回ファイルが上書きされます。そのため、最終結果しか得られません。

そのファイルに古いデータを保存したくない場合は、

rm /home/results/out.txt

スクリプトの始めに

答え2

echo -e `/opt/mssql-tools/bin/sqlcmd ... -o "out.txt"`

ここでは、コマンド置換を使用して出力をキャプチャsqlcmdし、次にechoを使用して再印刷します。これはほとんど役に立ちませんし、おそらく/opt/mssql-tools/bin/sqlcmd ... -o "out.txt"コマンドを置き換えますecho(引用符なしのコマンド置換+エコーは、すべてのスペースを単一のスペースに変換するという点で小さな違いがあります。)

sqlcmdこれで、すべての呼び出しのすべての出力を単一のファイルにリンクしたいと仮定すると、appendout(>>)を使用して結果を最終ファイルに直接送信できます。

sqlcmd正常に標準出力に出力される場合は、次のことができます。

/opt/mssql-tools/bin/sqlcmd -S server_name -U username -P user \
   -d db -Q "$SELECT_QUERY_1" | sed "s/^[ \t]*//" >> /home/results/out.txt

/dev/stdoutサポートされていない場合は、出力ファイルとして使用できます。

/opt/mssql-tools/bin/sqlcmd -S server_name -U username -P user \
   -d db -Q "$SELECT_QUERY_1" -o /dev/stdout | sed "s/^[ \t]*//" >> /home/results/out.txt

関連情報