Bash関数でインデントを使用して複数行をキャプチャする方法は?

Bash関数でインデントを使用して複数行をキャプチャする方法は?

bash機能があります

yumtelegraf() {
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
sudo yum install telegraf
}

関数でインデントを使用すると、ファイルにタブスペースが印刷されます。

yumtelegraf() {
  cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
  [influxdb]
  name = InfluxDB Repository - RHEL \$releasever
  baseurl = 
  https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
  enabled = 1
  gpgcheck = 1
  gpgkey = https://repos.influxdata.com/influxdb.key
  EOF
  sudo yum install telegraf
}

この行動を避ける方法は?
echoコマンドを使用してこれを達成することもできますか?

ベストアンサー1

たとえば、タブと(ダッシュを含む)を使用する<<-EOFか、猫の代わりにフィルタを使用します。sed:

$ sed -e "s/^\s*//" <<EOF
 as
  df
   gh
    jk
        op    # two tabs
EOF

これにより、スペースとタブが削除されます。端はEOFインデントできません。閉じるタグと同じ数のスペースを使用し<<" EOF"て再利用できますが、" EOF"引用符で文書が拡張されないため、この場合は望ましくありません。比較する:

$ a=x
$ cat <<EOF
"$a"
EOF
"x"
$ cat <<"EOF"
"$a"
EOF
"$a"

echoこの問題がある限り。ただし、次のprintfものを使用することもできます。

printf "%s\n" \
  "[influxdb]" \
  "name = InfluxDB Repository - RHEL \$releasever" \
  "baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable" \
  "enabled = 1" \
  "gpgcheck = 1" \
  "gpgkey = https://repos.influxdata.com/influxdb.key" \
| sudo tee /etc/yum.repos.d/influxdb.repo

あなたの質問にダッシュを残しましたが、\$拡張から外れているため、ここでは不正確かもしれません。

おすすめ記事