web-dev-qa-db-ja.com

echo / linuxを使用して複数行スクリプトで出力ファイルを作成する

(そのまま)出力ファイル内のスクリプトから一部を書き出すことができる小さなスクリプトを作成しようとする

ソースファイルのテキスト

echo "
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
" >> output.txt

望ましい出力:

yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&

私が得ているものは:

yellow=^[[33m
bel=^G
red=^[[31m
green=^[[32m
reset=^[(B^[[m
echo"#${green}Installing packages${reset}#" &&

CentOS 7を使用する最小限の新規インストール完全なスクリプト/テキストに適用されるソリューションを探して、行ごとの変更はありません。sedを使用しても実行できると思います...

11
Zaza

バックティックをエスケープする必要があります(`):

#!/bin/bash
echo "
yellow=\`tput setaf 3\`
bel=\`tput bel\`
red=\`tput setaf 1\`
green=\`tput setaf 2\`
reset=\`tput sgr0\`
" >> output.txt

ボーナスとして:

私はこの方法を複数行に使用することを好みます:

#!/bin/bash
cat << 'EOF' >> output.txt
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
EOF
20
N1ckles

展開を防ぐために一重引用符を使用します。

echo '
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
' >> output.txt

詳細は 二重引用符と単一引用符の違い を参照してください。


テキストに単一引用符が含まれている場合、上記は機能しない可能性があります。その場合、 here doc を使用する方が安全です。たとえば、次の行を挿入すると、上記が壊れます:var='something'

ヒアドキュメントを使用すると、次のようになります。

cat >> output.txt <<'EOF'
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
var='something'
EOF
4
Jahid

ちょうど遅い追加:

echo 'string' >> outputコマンドはシンプルで素晴らしいです。ただし、「...:Permission denied」エラーとSudoを組み合わせたエラーが表示される場合があります。

最近、sudo echo 'string \n other string \n' > /path/to/file

私にとって最も効果的なもの:
printf "Line1\nLine2\nLine3" | Sudo tee --append /path/to/file

実際に文字列をstdoutに出力するのもおまけなので、ファイルに書き込まれた内容を確認できます。

0
Gergely M

Chepnerに感謝

私が見つけた最良の解決策は:

echo '
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
echo"#${green}Installing packages${reset}#"
' >> output

このソリューションでは、すべてのテキストが変更なしで出力ファイルに送られ、カラー定義も変更なしで機能します。

0
Zaza