我想编写一个完整的 shell 脚本,用于>>
将命令附加到文件中。例如,请考虑以下脚本,就好像它是使用编辑器创建的一样。
echo Hello World, done
echo please enter the first number
read num1
echo please enter the second number
read num2
echo $num1 plus $num2 is `expr $num1 + $num2`
在终端窗口中,我尝试输入echo echo Hello World, "done" >> file.sh
将所有行写入文件。我在“done”两边加上引号,以确保当我运行文件时,终端不会考虑关键字“done”。但是,当我检查文件以查看是否正确完成时,关键字“done”没有引号。另外,上面代码中的最后一行,当在终端窗口中键入并附加到文件中时,所有文件显示的都是echo plus is
.我想知道为什么变量和表达式expr
不附加到文件中。我基本上想从终端窗口重新创建上面的代码。我正在运行 Ubuntu 12.04,bash 版本为 4.2.24
答案1
太棒了; shell 在附加到文件之前解释字符。
echo echo Hello World, "done" >> file.sh
shell 解释"
,将它们从标准中删除echo
。因此,你需要要么逃避它们,
echo echo Hello World, \"done\" >> file.sh
或者,更简单地说,将整个内容包含在'
.
echo 'echo Hello World, "done"' >> file.sh`
话虽如此,我不确定你的意思
确保当我运行文件时,终端不会考虑关键字“done”
done
a后面的Aecho
没有任何意义。新脚本只会打印一个文字done
。测试一下吧!
同样,对于
echo $num1 plus $num2 is `expr $num1 + $num2`
shell 解释变量并expr
前它附加到文件中。再次强调,只需将所有内容都包含在'
.
echo 'echo $num1 plus $num2 is `expr $num1 + $num2`' >> file.sh
话虽如此,我不知道你为什么要这样做。只需使用文本编辑器即可。当你想'
在脚本中使用文字时,这会很麻烦。
答案2
尝试以下结构:
$ cat > file.sh << "EOF"
echo Hello World, done
read num1
echo please enter the second number
read num2
echo Sum of $num1 and $num2 is `expr $num1 + $num2`
EOF
从零开始的Linux从脚本编写到文件创建的所有事情都使用此方法。如果done
覆盖EOF
,请考虑按照 Sparhawk 的建议转义它。
答案3
使用重定向从终端中的交互式 shell 创建文本文件(这就是 shell 脚本)的最简单方法就是执行以下操作:
$ cat >filename
...然后粘贴您想要的任何文本或开始输入(使用>>
而>
不是附加到一个已经存在的文件)。完成后,按Ctrl+D。
作为额外的好处,shell 不会另外解释您以这种方式粘贴或输入到文本文件中的内容。如果您要使用echo
插入单行或在此处文档插入多行,则必须记住通过正确使用引号来保护文本,以防止 shell 扩展文档内容中的变量、转义序列等。
要从脚本中创建脚本,请使用引用的此处文档
cat <<'END_SCRIPT' >filename
script
goes
here
END_SCRIPT
您在问题中遇到的问题是,当简单地添加echo
到行之前时,该行的其余部分仍然由 shell 解释,除非您采取额外的预防措施。