
質問:
- 変数にかなり長い値を割り当てる必要があります。
- 私のスクリプトのすべての行は特定の数の列の下になければなりません。
そこで複数行を使って配布してみました。
インデントがないと簡単です。
VAR="This displays without \
any issues."
echo "${VAR}"
結果:
This displays without any issues.
ただし、インデントを使用すると、次のようになります。
VAR="This displays with \
extra spaces."
echo "${VAR}"
結果:
This displays with extra spaces.
これらのスペースがなければ、どのように適切に割り当てることができますか?
答え1
ここでの問題は、変数を二重引用符("")で囲むことです。それを削除すると、すべてがうまくいくでしょう。
VAR="This displays with \
extra spaces."
echo ${VAR}
出力
This displays with extra spaces.
ここでの問題は、二重引用符で囲まれた変数がすべての空白文字を保持することです。明示的に必要に応じて使用できます。
例えば、
$ echo "Hello World ........ ... ...."
印刷する
Hello World ........ ... ....
引用符を削除した後、状況は異なります。
$ echo Hello World ........ ... ....
Hello World ........ ... ....
ここで Bash はテキストから余分なスペースを削除します。最初のケースでは、テキスト全体が「単一」引数として処理され、追加のスペースが保持されるためです。ただし、2番目のケースでは、echo
コマンドはテキストを5つのパラメータとして受け取ります。
コマンドに引数を渡すときに変数を引用することも役立ちます。
次のコマンドはecho
単一のパラメータのみを取得します。"Hello World"
$ variable="Hello World"
$ echo "$variable"
ただし、次の場合には、次のecho
2つのパラメータがあります。Hello
World
$ variable="Hello World"
$ echo $variable
答え2
与えられた解決策エルスそしてミカエル・ブカスこれを行う一般的で移植可能な方法です。
以下はいくつかのソリューションですbash
(一部は他のシェルでも機能しますzsh
)。+=
整数変数、一般変数、および配列に対してわずかに異なる動作をする追加の演算子を使用して始めます。
text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod "
text+="tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
text+="quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea ..."
テキストに改行(または他のスペース/エスケープ)が必要な場合は、$''
引用符を使用してください。
text=$'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n'
text+=$'...'
次に、次のようにフォーマットされたprintf -v
値を変数に割り当てます。
printf -v text "%s" "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed " \
"do eiusmod empor incididunt ut labore et dolore magna aliqua. "\
"Ut enim ad minim veniam ..."
ここで重要なのは、型指定子よりも引数が多いことです。したがって、printf
ほとんどの関数とは異なり、bashはフォーマット文字列がすべて使用されるまで再利用します。\n
フォーマット文字列にaを入れるか、$ ''(またはその両方)を使用してスペースを処理できます。
次に配列を使用します。
text=("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod "
"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
"quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea ..." )
(注)+=
を使用して1行ずつテキストを作成することもできます。()
text+=("post script")
ただし、ここでテキスト全体のコンテンツを一度に取得するには、配列を「平面化」する必要があることに注意してください。
echo "$text" # only outputs index [0], the first line
echo "${text[*]}" # output complete text (joined by first character of IFS)
(整数インデックス配列は連想配列とは異なり、暗黙的に並べ替えられます。)これにより、行を操作できるため、より柔軟性が得られます。スライスとサイコロ必要に応じて。
最後に、read
またはreadarray
「ここにドキュメント」を使用してください。
read -r -d '' text <<-"EOT"
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea ...
EOT
readarray -t textarray <<-"EOT"
Lorem [...]
EOT
ここでドキュメントフォームは、<<-
すべての先行するハードタブ文字が入力から削除されるため、テキストをインデントするにはタブ文字を使用する必要があることを意味します。二重引用符は"EOT"
シェル拡張機能を避けるため、入力は文字通り使用されます。 NULバイトを使用read
して入力を区切るので、改行で区切られたテキストを一度に読み取ります。配列を読み、各行から改行を削除するreadarray
(別名、bash-4.0から利用可能)を使用してください。mapfile
-t
答え3
削除する特別なheredoc構文があります。タブすべての行の先頭: "<<-" (追加されたダッシュに注意)
http://tldp.org/LDP/abs/html/here-docs.html
例19-4.複数行メッセージ、タブが表示されない
次のように使用できます。
v="$(cat <<-EOF
A
B
C
EOF
)"
echo "$v"
結果:
A
B
C
空白ではなくタブでのみ機能します。
答え4
シェルが望ましくない改行と次のスペースを食べるようにしてください。
$ cat weird.sh
#!/bin/sh
var1="A weird(?) $(
)multi line $(
)text idea. $(
)PID=$$"
var2='You can '$(
)'avoid expansion '$(
)'too: PID=$$'
var3='Or mix it: '$(
)'To insert the PID use $$. '$(
)"It expands to e.g. $$."
echo "$var1"
echo "$var2"
echo "$var3"
$ sh weird.sh
A weird(?) multi line text idea. PID=13960
You can avoid expansion too: PID=$$
Or mix it: To insert the PID use $$. It expands to e.g. 13960.
だから可能です...しかし、確かにこのソリューションが好きで好きではないのは好みの問題です...