是否有任何sh代码在语法上不是有效的 bash 代码(不会对语法造成障碍)?
我想重写sh与bash某些命令。
具有运算符优先级的经典场景,您有如下一行:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
Run Code Online (Sandbox Code Playgroud)
你不知道它是否被解析((A && B) | C)或(A && B | C)......
在这里找到的几乎官方文档没有在列表中列出管道,所以我不能简单地检查表格。
此外,在 bash 中,(不仅用于更改操作顺序,还创建了一个 subshell,所以我不是 100% 确定此行与上一行等效:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
Run Code Online (Sandbox Code Playgroud)
更一般地说,如何知道bash 行的AST?在 python 中,我有一个函数可以为我提供树,以便我可以轻松地仔细检查操作顺序。
我正在使用GNU bash 4.3.48. 考虑以下两个仅相差一个美元符号的命令。
命令 1:
echo "(echo " * ")"
Run Code Online (Sandbox Code Playgroud)
命令 2:
echo "(echo " * ")"
Run Code Online (Sandbox Code Playgroud)
它们的输出分别为
(echo test.txt ppcg.sh )
Run Code Online (Sandbox Code Playgroud)
和
*
Run Code Online (Sandbox Code Playgroud)
所以很明显,在第一种情况下,the *is globbed,这意味着第一个引号与第二个组成一对,第三个和第四个组成另一对。
在第二种情况下,the *is not globbed,并且输出中正好有两个额外的空格,一个在星号之前,一个在星号之后,这意味着第二个引号与第三个一起,第一个与第四个一起。
除了$()引号与下一个不匹配,而是嵌套的构造之外,还有其他情况吗?这种行为是否有详细记录,如果有,我在哪里可以找到相应的文档?
我有一个 JSON 片段。
以下不起作用:
VALUE=<<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "jim@gmail.com"
}
PERSON
echo -n "$VALUE" | python -m json.tool
Run Code Online (Sandbox Code Playgroud)
结果是:
无法解码 JSON 对象
做同样的事情jq,即
echo -n "$VALUE" | jq '.'
Run Code Online (Sandbox Code Playgroud)
没有输出。
以下行为具有相同的行为:
VALUE=<<PERSON
'{
"type": "account",
"customer_id": "1234",
"customer_email": "jim@gmail.com"
}'
PERSON
echo -n "$VALUE" | python -m json.tool
Run Code Online (Sandbox Code Playgroud)
回复:
无法解码 JSON 对象
但以下工作:
VALUE='{
"type": "account",
"customer_id": "1234",
"customer_email": "jim@gmail.com"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
Run Code Online (Sandbox Code Playgroud) 我正在尝试以符合 POSIX 的方式将 HEREDOC 文本带入 shell 脚本变量中。我试过这样:
#!/bin/sh
NEWLINE="
"
read_heredoc2() {
while IFS="$NEWLINE" read -r read_heredoc_line; do
echo "${read_heredoc_line}"
done
}
read_heredoc2_result="$(read_heredoc2 <<'HEREDOC'
_ _ _
| | | (_)
_ __ ___ _ _ _ __ | | __ _ ___ ___ ___ _ __ | |_ _ __ ___
| '_ ` _ \| | | | '_ \| |/ _` |/ __/ _ \/ _ \| '_ \| | | '_ \ / _ \
| …Run Code Online (Sandbox Code Playgroud)