如何在Ubuntu中通过命令行自动创建指定内容的script.sh脚本
自动化创建目标script.sh的正确方法
推荐方案:Here Document(最简洁可靠)
这种方式无需复杂转义,能完整保留原代码的所有符号、变量和引号结构:
sudo bash << 'EOF' > /etc/temp/script.sh #!/bin/bash paths=($(ls -l /home/*/.bashrc | awk "{print \$NF}")); echo "${paths[@]}" for path in "${paths[@]}" do sudo sh -c "echo 'if [ -z \"\$HISTTIMEFORMAT\" ] then export HISTTIMEFORMAT=\"%F %T \" fi' >> \"$path\"" done EOF
- 说明:
<< 'EOF'表示后续直到EOF的内容会原样写入文件,不会被当前Shell解析变量或引号,完美匹配需求。 - 注意:如果
/etc/temp目录不存在,先执行sudo mkdir -p /etc/temp创建,或者替换为系统默认临时目录/tmp。
原命令失败原因
你之前的命令存在两个核心问题:
- 嵌套多层单/双引号时,转义逻辑混乱,导致部分引号提前闭合,代码结构被破坏;
- 单引号内的
$(ls -l ...)会被当前Shell提前执行,而不是作为字符串写入文件,最终生成的脚本内容不符合预期。
备选方案:使用printf转义
如果偏好单行命令方式,可通过逐层转义引号和变量实现:
sudo printf '%s\n' '#!/bin/bash' 'paths=($(ls -l /home/*/.bashrc | awk "{print \$NF}")); echo "${paths[@]}"' '' 'for path in "${paths[@]}"' 'do' ' sudo sh -c "echo '\''if [ -z \"\$HISTTIMEFORMAT\" ]' '' ' then export HISTTIMEFORMAT=\"%F %T \"' '' ' fi'\'' >> \"\$path\""' 'done' > /etc/temp/script.sh
不过这种方式转义复杂,容易出错,优先推荐Here Document方案。
内容的提问来源于stack exchange,提问作者Mund
相关产品推荐
相关产品推荐

