varを持つエコー行には複数の行が含まれています。

varを持つエコー行には複数の行が含まれています。

以下の内容を含む「file1.txt」というファイルがあります。

bibi.toto
jaja.bubu
vrtegbvtr.rvgtbtdtbvtd

次のようにvarコンテンツ(file1.txt行を含む)でいくつかのテキストをエコーし​​たいと思います。

var=$(cat file1.txt)
echo 'hello there is $var' > final.sh

ついに得た:

final.sh content:

hello there is bibi.toto
hello there is jaja.bubu
hello there is vrtegbvtr.rvgtbtdtbvtd

スクリプトはBusiness Boxアプレット(awk、grep、sed、cat...)を使用する必要があります。

-----------------------------

最初にechoコマンドを試してみましたが、次のような結果が出ました。 hello二重引用符(")を使用しても、{}ではなく$ varがあり、テキストに 'と"があるため、二重引用符を使用してファイルに内容をエコーすることはできません。シンボル。

私も次のようにsedを試しました。

var=$(cat file1.txt)

final.sh content:
hello there is pattern

sed "s/pattern/$var/g" final.sh

しかし、私は次のようになります。

ベストアンサー1

努力する:

sed 's/^/hello there is /' file1.txt > final.sh

または変数を使用する必要がある場合:

printf '%s\n' "$var" | sed 's/^/hello there is /' > final.sh

空の行を失っても問題ない場合は、次のようにすることもできます。

IFS='
' # split on newline
set -o noglob # disable glob
printf 'hello there is %s\n' $var > final.sh # invoke split+glob

実際の質問の場合:

sed "s/.*/UPDATE ownership SET library_id = 'u-wl' where doc_id = '&';/" < file1.txt |
  sqlite "$PLAY_DB_DIR/library.db"

(ファイルのエントリに'sqliteまたは他の特殊バイトシーケンスが含まれていないと仮定します。これを保証できない場合は、せいぜいsqlite注入の脆弱性のみです。)

または、後で実行するシェルコードを出力する必要がある場合:

{
  echo 'sqlite "$PLAY_DB_DIR/library.db" << "EOF"'
  sed "s/.*/UPDATE ownership SET library_id = 'u-wl' where doc_id = '&';/" < file1.txt
  echo EOF
} > final.sh

あなたのサンプルは以下を提供します。

sqlite "$PLAY_DB_DIR/library.db" << "EOF"
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'bibi.toto';
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'jaja.bubu';
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'vrtegbvtr.rvgtbtdtbvtd';
EOF

またはあなたが持つクエリごとに1つのコマンドを実行しますsqlite

repl=$(cat << "EOF"
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\\''u-wl'\\'' where doc_id = '\\''&'\\'';'
EOF
)
sed "s@.*@$repl@" < file1.txt > final.sh

(今回はsqlite注入の脆弱性に加えて、ファイルに一重引用符文字が含まれる可能性がある場合は、任意のコマンド実行の脆弱性になります。)

サンプルでは、​​以下を提供します。

sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''bibi.toto'\'';'
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''jaja.bubu'\'';'
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''vrtegbvtr.rvgtbtdtbvtd'\'';'

おすすめ記事