总结

总结

完成上述步骤后:

  1. missing在 下创建了一个名为 的新目录/tmp
  2. 用于touch在缺失中创建一个名为semester的新文件。

我如何将以下内容一次一行地写入该文件?

#!/bin/sh
curl --head --silent https://missing.csail.mit.edu

网站发布此练习的地方提到了以下内容(请参阅最后的练习 4):

第一行可能很难运行。了解 # 在 Bash 中开始注释会很有帮助,而 ! 即使在双引号 (") 字符串中也有特殊含义。Bash 以不同方式处理单引号字符串 ('):在这种情况下,它们会起作用。有关更多信息,请参阅 Bash 引用手册页。

答案1

总结

我猜这个练习的主要目的是让你理解引用传递给每个命令的参数的重要性,因此你应该在将每一行传递给 echo 之前对其进行引用:

echo '#!/bin/sh' > /tmp/missing
echo 'curl --head --silent https://missing.csail.mit.edu' >> /tmp/missing

详细说明

正如问题的建议所解释的那样,其中的主要困难是添加第一行,因为它包含一个#特殊字符,表示bash开始注释。为了将其写入所需的文件,更直接的方法是像这样引用整行:

echo '#!/bin/sh' > /tmp/missing

您不需要引用第二行,因为它不包含任何bash特殊字符,该行中没有单词是 的标志或选项,echo并且没有连续的空格(将被视为单个空格,因为每个单词都将被视为 的参数echo)。但是,由于您不需要引用该行的原因非常脆弱,因此最好始终引用它,并且通常引用命令的参数,除非您希望将行中的每个单词都解释为参数,或者您希望 bash 以任何其他方式处理某些内容。然后,您要运行的第二条命令是:

echo 'curl --head --silent https://missing.csail.mit.edu' >> /tmp/missing

但请注意,对于包含 的行',您不应仅用单引号将该行括起来,因为第一个单引号表示引用文本的结尾。在这种情况下,您可以在每个单引号前停止引用,也可以在每个单引号后开始引用,还可以对每个单引号进行转义或引用;也就是说,用\'或替换引号"'"

例如,为了得到echo一行don't just suround me with quotes,您可以执行以下操作:

echo 'don'\''t just suround me with quotes'

考虑到这些因素将帮助您将所需的参数传递给每个命令,并避免最常见的bash错误。

替代解决方案

如果不考虑一次写一行的要求,您可以执行以下操作:

cat <<'EOF' > /tmp/missing
#!/bin/sh
curl --head --silent https://missing.csail.mit.edu
EOF

为了更多地了解这个习语,你可以参考man bash或这个其他问题在 stackoverflow 上。

相关内容