我想/bin/sh
在 BSD 平台上的 POSIX shell ( ) 中处理多行字符串并逐行迭代它。Bash 不包含在基本的 BSD 发行版中,并且具有 GPL 许可证 - 所以我试图使其普遍适用/bin/sh
。
我找到了一个使用管道的解决方案,但是在常规/bin/sh
shell 中,这些是在单独的进程中处理的,这意味着以下内容不起作用:
MULTILINE="`cat ${SOMEFILE}`"
SOMEVAR="original value"
echo "${MULTILINE}" | while IFS= read -r SINGLELINE
do
SOMEVAR="updated value"
echo "this is a single line: ${SINGLELINE}"
echo "SOMEVAR is now: ${SOMEVAR}"
done
echo "Final SOMEVAR is unchanged: ${SOMEVAR}"
在上面的示例中,它完成了我想要的,除了对变量的更改,例如${SOMEVAR}
在 while 循环之外无法访问。
我的问题:如果没有这个限制,我怎样才能完成上面的事情?请注意,许多解决方案都需要 Bash,而我使用的是标准 POSIX-shell /bin/sh
。
您可以使用此处的文档:
根据
sh
实现的不同,here-documents 被实现为一个已删除的临时文件,其中 shell 预先存储了变量的扩展,然后是换行符,或者是一个管道,shell 将变量的扩展提供给它,然后是换行符。但是在任何一种情况下,除了原始的 Bourne shell(现在不再使用的 shell 并且不是 POSIX 兼容的 shell)之外,被重定向的命令不会在子 shell 中运行(因为 POSIX 需要)。或者你可以使用 split+glob:
但请注意它会跳过空行。
您将直接从文件中读取而无需管道。这避免了
while
在子 shell 中运行循环,这样您就可以看到$SOMEVALUE
循环后的更改值。如果您坚持使用
$MULTILINE
变量,则将其写入文件并从那里读取:还有相关的:
对上述链接问题的回答还建议以这样一种方式编写程序,即所有使用都
$SOMEVAR
发生在管道末端的子shell中:也可能相关:
其他可能感兴趣的问题:
这个对我有用 :
和