如何使用终端编写 shell 脚本?

如何使用终端编写 shell 脚本?

我想编写一个完整的 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”

donea后面的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 解释,除非您采取额外的预防措施。

相关内容