次のループの出力を別のループの下に追加したいのですが、出力ファイルでは "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