相关疑难解决方法(0)

是否有任何 sh 代码在语法上不是有效的 bash 代码?

是否有任何sh代码在语法上不是有效的 bash 代码(不会对语法造成障碍)?

我想重写shbash某些命令。

bash shell-script posix

31
推荐指数
2
解决办法
2891
查看次数

bash 中管道 (|) 和逻辑与 (&&) 的优先级

具有运算符优先级的经典场景,您有如下一行:

(cd ~/screenshots/ && ls screenshot* | head -n 5)
Run Code Online (Sandbox Code Playgroud)

你不知道它是否被解析((A && B) | C)(A && B | C)......

这里找到的几乎官方文档没有在列表中列出管道,所以我不能简单地检查表格。

此外,在 bash 中,(不仅用于更改操作顺序,还创建了一个 subshel​​l,所以我不是 100% 确定此行与上一行等效:

((cd ~/screenshots/ && ls screenshot*) | head -n 5)
Run Code Online (Sandbox Code Playgroud)

更一般地说,如何知道bash 行的AST?在 python 中,我有一个函数可以为我提供树,以便我可以轻松地仔细检查操作顺序。

bash

27
推荐指数
3
解决办法
9757
查看次数

bash中的双引号如何匹配(配对)?

我正在使用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,并且输出中正好有两个额外的空格,一个在星号之前,一个在星号之后,这意味着第二个引号与第三个一起,第一个与第四个一起。

除了$()引号与下一个不匹配,而是嵌套的构造之外,还有其他情况吗?这种行为是否有详细记录,如果有,我在哪里可以找到相应的文档?

bash quoting wildcards

15
推荐指数
1
解决办法
3319
查看次数

为什么来自 heredoc 的 JSON 内容无法解析?

我有一个 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)

shell here-document variable json

15
推荐指数
3
解决办法
5726
查看次数

如何将 HEREDOC 文本带入 shell 脚本变量?

我正在尝试以符合 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)

shell-script posix

12
推荐指数
2
解决办法
7598
查看次数

标签 统计

bash ×3

posix ×2

shell-script ×2

here-document ×1

json ×1

quoting ×1

shell ×1

variable ×1

wildcards ×1