複数行のシェル変数を指定する方法は?


122

私はクエリを書きました:

function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}

ローカルSQL-非常に長い文字列。クエリはフォーマットされていません。文字列を複数の行に分割するにはどうすればよいですか?


4
shellここでよく話していることは何ですか?なければならないbatchことbashや、あなたがダークサイドから実際にありますか?
Chris Seymour

1
これがshell / bashの場合は=、スペースで囲まないでください。
Nik O'Lai 2013年

回答:


138

read以下に示すように、ヒアドキュメントと一緒に使用します。

read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF

echo "$sql"

52
readこの場合、終了コードは1になることに注意してください。それが重要な場合(set -eたとえば、で実行している場合)、|| true最初の行の終わりにa を追加する必要があります。
chepner 2013年

4
set -eコマンドに「予期しない」ゼロ以外の終了ステータスがある場合、シェルを終了します。「予期しない」とは、終了ステータスを特に確認していないコンテキストで実行されることを意味します。falseたとえば、単独でシェルを終了します。false || true最初のコマンドが失敗した場合に実行する別のコマンドを指定することにより、ゼロ以外の終了ステータスを予測しているためです。
chepner 2015

1
set -eおよびread(最後の演習を参照)の問題は、ここで詳しく説明されています。mywiki.wooledge.org
Niklas Peter

5
-d ' 'ここで何をしますか?
hg_git 2016

3
@hg_git read改行に遭遇したときに読み取りを停止しないように指示します。
Cyker

170

必要な場所に新しい行を挿入するだけです

sql="
SELECT c1, c2
from Table1, Table2
where ...
"

シェルは終了引用符を探します


7
SQLクエリに二重引用符が含まれている場合は、適切な解決策ではありません。あなたはそれらを脱出する必要があり、それは乱雑になります。
dogbane 2013年

13
@dogbaneの二重引用符がほとんどのSQL方言で表示されることはほとんどないため、実際にはこれで問題ありません。
Iain Samuel McLean Elder

4
次に、文字列を一重引用符で囲みます。
tripleee 2016年

先頭の改行が必要な理由または必要な理由がわかりません。私のアプリケーションでは、私はそうしなかったので、私はちょうど始めましたsql="SELECT c2, c2
bhfailor

1
それが本当であるには余りにも簡単に思えるのはおかしい。参考までに、DQを追加するには、変数DQ = '\ "'を作成し、ステートメントで$ {DQ}を使用して参照します
ティモシーC.クイン

69

もう1つお答えしたいと思いますが、ほとんどの場合、他の質問で十分です。

文字列を複数行にわたって記述したかったのですが、その内容は1行である必要がありました。

sql="                       \
SELECT c1, c2               \
from Table1, ${TABLE2}      \
where ...                   \
"

これが少し話題から外れているとすみません(SQLにはこれは必要ありませんでした)。ただし、この投稿は、複数行のシェル変数を検索したときの最初の結果の1つであり、追加の回答が適切であると思われました。


1
\がなくても、私のコンテンツは1行で表示されます。
papiro 2016年

12
@papiro、echo "$sql"代わりに試してくださいecho $sql
Michael Mol

@MichaelMol-最初のLinuxインストールから約20年経った今でも、私は何か新しいことを学ぶ。この「トリック」をありがとう。
Seth

6

同様の質問に対するdimo414の回答のおかげで、これは彼の優れたソリューションがどのように機能するかを示し、テキスト内に引用符と変数を簡単に含めることができることを示しています。

出力例

$ ./test.sh

The text from the example function is:
  Welcome dev: Would you "like" to know how many 'files' there are in /tmp?

  There are "      38" files in /tmp, according to the "wc" command

test.sh

#!/bin/bash

function text1()
{
  COUNT=$(\ls /tmp | wc -l)
cat <<EOF

  $1 Would you "like" to know how many 'files' there are in /tmp?

  There are "$COUNT" files in /tmp, according to the "wc" command

EOF
}

function main()
{
  OUT=$(text1 "Welcome dev:")
  echo "The text from the example function is: $OUT"
}

main

5

read変数をエクスポートしません(ほとんどの場合、これは良いことです)。1つのコマンドでエクスポートでき、改行を保持または破棄でき、必要に応じて引用スタイルを混在させることができる代替方法を次に示します。bashとzshで動作します。

oneLine=$(printf %s \
    a   \
    " b "   \
    $'\tc\t'    \
    'd '    \
)
multiLine=$(printf '%s\n' \
    a   \
    " b "   \
    $'\tc\t'    \
    'd '    \
)

引用する必要があるのでSQLの見栄えが悪くなりますが、タイトルの(より一般的に表現されている)質問に答えます。

このように使っています

export LS_COLORS=$(printf %s    \
    ':*rc=36:*.ini=36:*.inf=36:*.cfg=36:*~=33:*.bak=33:*$=33'   \
    ...
    ':bd=40;33;1:cd=40;33;1:or=1;31:mi=31:ex=00')

my .bashrcとの両方から供給されたファイル内.zshrc

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.