使用 GREP 从文件中提取文本并存储在数组中的 Bash 语法

使用 GREP 从文件中提取文本并存储在数组中的 Bash 语法

我最近从升级bash 4.2.46bash version 4.2.50

我有一个脚本,其中包含以下行:

mapfile -t my_array < <(grep ${ID} -w /etc/passwd | cut -d ":" -f 1,4,5)

其中 ID 是我们要在文件中查找的任意整数passwd,然后将所有结果加载到数组中。

以前可以工作,但现在会引发错误

usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] -e pattern_list...
        [-f pattern_file...] [file...]
usage: grep [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] [-e pattern_list...]
        -f pattern_file... [file...]

谁能解释一下如何解决这种折旧问题?我尝试使用sedawk但问题似乎是我的输出重定向的格式。

文本文件passwd看起来像这样 name:garbageData:garbageData:ID:password

答案1

如果您使用 ksh 而不是 bash 执行脚本,则会出现该错误; sh-bang 标题行错误地指向 ksh,或者它指向 /bin/sh(AIX 上的 ksh),或者您明确将其称为ksh /the/script.

ksh 不支持mapfileksh93t+ 之前的版本,即<( ...)进程替换语法当用作重定向的目标时, 例如<。澄清由斯蒂芬·查泽拉斯

修复 sh-bang 行以调用 bash(或者显式调用 bash 而不是 ksh,如果是这种情况)。

此外,该grep命令会抱怨,因为您在所有选项之前都放置了一个参数;将 grep 重新排列为:

grep -w "${ID}" /etc/passwd

(也引用变量扩展)。

相关内容