小编Dan*_*lan的帖子

如果我正在编写 bash 脚本,为什么要关心 POSIX?

寻找我可以对此问题提出的建议/编辑以重新打开它。其中很多答案对我来说似乎都是客观的,它们正是我正在寻找的答案类型。


我读过四篇有关 POSIX 的文章,但未能找到答案。现在我知道 POSIX什么,我已经知道标准是什么,但我仍然不确定为什么 POSIX 标准今天仍然具有相关性。我读过的三篇文章之一是对理查德·斯托曼的采访。在其中,他说

Seth:符合 POSIX 标准的自由软件项目是否更容易移植到其他类 Unix 系统?

RMS:我想是这样,但我在 20 世纪 80 年代决定不花时间将软件移植到 GNU 以外的系统上。...

Seth:POSIX 对软件自由重要吗?

RMS:从根本上来说,这没有什么区别。然而,标准化……帮助我们更快地迈向……自由软件。这是在 20 世纪 90 年代初实现的……[强调我的]

他的答案带有 GNU 观点的色彩,但他似乎是在回答我的问题,“POSIX 不再相关”?

这里有一些更具体的内容来解释为什么我首先对此感兴趣:在这个答案中,我建议使用进程重定向<(command)。回复称:“不幸的是,进程重定向是一项非 POSIX 功能,因此并非所有机器都支持它。”

我想我假设脚本以#!/bin/bash. 既然进程重定向是 bash 的一项功能,那么这是否意味着任何带有 bash 的系统都是可移植的?根据维基百科的说法,bash“已被用作大多数 Linux 发行版的默认登录 shell”。

然而,本文称,“目前,除了两个商业 Linux 发行版浪潮 K-UX [12] 和华为 EulerOS [6] 之外,由于成本高昂,Linux 尚未获得 POSIX 认证。相反,Linux 被视为主要是符合 POSIX 标准。”

所以,我认为POSIX …

gnu shell-script posix

22
推荐指数
2
解决办法
4128
查看次数

将 JSON 数组拆分为多个文件

我有一个看起来像这样的文件:

[
  {
    "billingAccountNumber": "x",
    "paymentResponseObject": {
      "uiErrorDipslayMessage": "",
      "transactionStatus": "S",
      "transactionDescription": "",
      "transactionCode": "",
      "confirmationNumber": "1"
    }
  },
  {
    "billingAccountNumber": "y",
    "paymentResponseObject": {
      "uiErrorDipslayMessage": "",
      "transactionStatus": "S",
      "transactionDescription": "",
      "transactionCode": "",
      "confirmationNumber": "2"
    }
  },
  {
    "billingAccountNumber": "z",
    "paymentResponseObject": {
      "uiErrorDipslayMessage": "",
      "transactionStatus": "S",
      "transactionDescription": "",
      "transactionCode": "",
      "confirmationNumber": "3"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

数据看起来不像这样,我有三个以上的元素。从这个数据,我想创建三个文件:x.jsony.json,和z.json。我希望每个文件的内容都是paymentResponseObject.

有没有办法做到这一点jq?我已经想出了如何在awk. 我必须awk为每个模式重写 80% 的脚本。

files json jq

7
推荐指数
1
解决办法
4343
查看次数

如何将带有空格的文件名从列表文件传输到“grep”?

首先,我认为我使用 cygwin 的事实在这里非常相关。

理论上,我已经知道如何做到这一点:

cat file | xargs grep pattern
Run Code Online (Sandbox Code Playgroud)

问题是,其中的一些文件路径file有空格。该文件如下所示:

subdir/foo/bar.html
subdir/f o o/ba r.html
subdir/~foo/bar.html
Run Code Online (Sandbox Code Playgroud)

这会导致错误。我阅读了如何解决这个问题:使用xargs -0. 但我不知道如何使cat输出以空结尾的行结尾,所以我认为这意味着它将整个文件压缩成一行。结果,它给出了这个错误:

xargs: argument line too long
Run Code Online (Sandbox Code Playgroud)

更新:原来我正在读取的文件有一些不再存在的路径。巧的是,所有这些路径中都有一个~,所以我错误地认为这是一个问题。尽管如此,关于空间的一切仍然存在。原来这些文件根本不存在。

shell cygwin text-processing filenames

7
推荐指数
1
解决办法
670
查看次数

如何从一行中提取数字并将其保存到变量中?

我觉得这是一个非常简单的问题,当我谷歌时,我为部分问题找到了很多答案,但是当我尝试将它们放在一起时,它不起作用,我无法弄清楚为什么。

这是场景:

  1. 我有一个包含大量文本的文件。
  2. 其中一行与此模式匹配: foo = 1700;
  3. 我想提取 1700
  4. 我想将它保存到 bash 脚本变量中,以便稍后在脚本中引用它。

我无法通过第 3 步。这是我尝试过的:

sed -nE 's/^foo = //p' file | sed -nE 's/;//p'
Run Code Online (Sandbox Code Playgroud)

这打印出来:

1700
Run Code Online (Sandbox Code Playgroud)

很好,但是如果我需要修剪空白或其他东西怎么办?如果我不能使用*/ +,我就不知道该怎么做。我了解到您不能在另一个答案中使用*/+替代,所以我不知道如何做到这一点。我查看了 grep 的手册页,当我搜索该词时,我没有看到任何组选项。我想我知道如何在 awk 中解决这个问题,但我一直发现它的正则表达式函数有点笨拙,而且命令行脚本需要太多的转义,所以理想情况下这不是解决这个问题的唯一方法。

grep sed regular-expression

2
推荐指数
1
解决办法
417
查看次数

如何将多行文件的内容作为参数传递?

我正在尝试运行一个带-t参数的脚本。这个参数代表文本,并且值——理论上——可以是多行的。在命令行上,我假设 Here Document 可以工作,但我不喜欢在命令行上输入长内容。另外,我希望这个文件能够持久化,以便我以后可以再次传递它。

我不知道该怎么做;如果 I cat foo | xargs echo,它打印为一行。这修复了:cat foo | xargs -d='' echo,但它让我觉得有些我不明白的东西会根据其内容改变文档的空白或一般结构。

如何将多行文件作为参数传递而不必担心特殊字符或更改其格式?

command-line bash io-redirection xargs files

2
推荐指数
1
解决办法
327
查看次数

如何打印我的脚本中定义的所有变量的名称和值?

我正在编写一个脚本,在这种情况下,如果我可以看到所有脚本定义的变量名称和值的转储,这对我确实有帮助。这是一个例子:

foo="1"
bar="2"

print_script_variables 

baz="3"

print_script_variables 
Run Code Online (Sandbox Code Playgroud)

这将输出:

foo="1"
bar="2"

foo="1"
bar="2"
baz="3"

Run Code Online (Sandbox Code Playgroud)

有类似的东西print_script_variables存在吗?我有一种感觉,解析您正在执行的脚本是一件愚蠢的事情。

echo如果这不存在,我只会手动输入一堆命令。这有点烦人,因为我想在print_script_variables排除故障时移动放置的位置,而不必担心哪些变量进入和超出范围。

这是一个 bash 脚本,但我在终端中使用 zsh,因此在两者中都适用的东西将是理想的。

bash shell-script

2
推荐指数
1
解决办法
1979
查看次数