使用 echo / linux 创建包含多行脚本的输出文件
Creating an output file with multi line script using 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 最小化全新安装
寻找一个应用于完整 script/text 的解决方案,没有每行更改的行,我想也可以使用 sed 来完成...
使用单引号防止展开:
echo '
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
' >> output.txt
有关详细信息,请参阅 Difference between double and single quote。
如果您的文本包含单引号,则上述方法可能无效。在那种情况下使用 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
您需要转义反引号 (`):
#!/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
感谢 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
使用此解决方案,所有文本无需修改即可进入输出文件,颜色定义也无需修改即可工作。
只是一个迟到的补充:
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
额外的是您实际上也将字符串打印到标准输出,因此您将看到写入文件的内容。
尝试创建一个小脚本,能够在不进行任何更改的情况下从输出文件中的脚本中删除一部分,(按原样)
源文件文本
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 最小化全新安装 寻找一个应用于完整 script/text 的解决方案,没有每行更改的行,我想也可以使用 sed 来完成...
使用单引号防止展开:
echo '
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
' >> output.txt
有关详细信息,请参阅 Difference between double and single quote。
如果您的文本包含单引号,则上述方法可能无效。在那种情况下使用 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
您需要转义反引号 (`):
#!/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
感谢 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
使用此解决方案,所有文本无需修改即可进入输出文件,颜色定义也无需修改即可工作。
只是一个迟到的补充:
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
额外的是您实际上也将字符串打印到标准输出,因此您将看到写入文件的内容。