我对 shell 编程还不熟悉,遇到了这样的错误。为什么会出现这样的错误?你能告诉我吗?
#!/bin/bash
echo ""
echo -e " _ _ _ _ _ _"
echo -e "__ _/ |_ __| |_| | || | | |__"
echo -e "\ \ / / | '__| __| | || |_| '_ \"
echo -e " \ V /| | | | |_| |__ _| |_) |"
echo -e " \_/ |_|_| \__|_| |_| |_.__/"
echo ""
笔记: 我运行的命令 ->bash virtlab
错误
virt_lab: line 1: #!/bin/bash: No such file or directory
_ _ _ _ _ _
__ _/ |_ __| |_| | || | | |__
virt_lab: line 13: syntax error near unexpected token `|'
virt_lab: line 13: `echo -e "\ \ V /| | | | |_\| |__ _\| |_) |"'
答案1
主要问题
此片段:
echo -e "\ \ / / | '__| __| | || |_| '_ \" echo -e " \ V /| | | | |_| |__ _| |_) |"
这些都是不是两个单独的命令。如果您尝试仅运行第一行,您将看到 shell 需要进一步的输入。
\"
第一行末尾的双引号是转义双引号。它不会关闭引号。后面的换行符是双引号,因此命令继续。引号在下一行未转义的"
后面结束echo -e
。后面的字符未加引号;这包括| | |
。未加引号|
的是管道运算符。连续两个或多个管道运算符无效,因此出现错误。
由于双引号反斜杠 ( \
) 可能很特殊,因此使用单引号字符串更安全。除非字符串本身包含单引号字符 ( '
)。代码中的某些字符串确实如此,包括麻烦的字符串。您仍然可以通过以不同方式引用不同部分或通过适当的转义来实现所需的结果。
注意,通过使用echo -e
(而不是普通的echo
),你制作了反斜杠echo
也可能很特别(不过这个事实还没有困扰你。)一般来说最好使用printf
。
这是通过两种不同的方式修复的麻烦的命令:
echo "\ \ / / | '__| __| | || |_| '_ \\"
echo "\ \ / / | '__| __| | || |_| '_ "'\'
还有更多方法可以正确地引用/转义整个字符串。通常,您需要知道 shell 如何解释引号、反斜杠等。
但是,在这种情况下,如果你使用这里的文件。
cat <<'EOF'
_ _ _ _ _ _
__ _/ |_ __| |_| | || | | |__
\ \ / / | '__| __| | || |_| '_ \
\ V /| | | | |_| |__ _| |_) |
\_/ |_|_| \__|_| |_| |_.__/
EOF
注意我EOF
在 之后加了引号<<
。如果没有这个引号,某些字符(包括\
)将会/可能是特殊的,而不是文字。
元注释
我们的网站会在您发布问题后立即通过为问题中的代码添加颜色来提示您。颜色方案似乎有所变化。这是屏幕截图(以防将来出现问题):
附带问题
如果文件是virtlab
,并且您使用该文件运行它,bash virtlab
那么你不需要这个(#!/bin/bash
)。 它似乎有些事 事情搞错了无论如何,你得到了No such file or directory
。
答案2
例如,你可以这样写:echo '$''FileCreateMode 0640' >> /etc/rsyslog.conf
输出:$FileCreateMode 0640