什么是POSIX shell相当于bash <<<

Bit*_*iot 5 bash sh

我有一个看起来像这样的变量:

msg="newton apple tree"
Run Code Online (Sandbox Code Playgroud)

我想将每个单词分配到单独的变量中.这在bash中很容易做到:

read a b c <<< $msg
Run Code Online (Sandbox Code Playgroud)

在POSIX shell中是否有一种紧凑,可读的方法?

che*_*ner 12

这里的字符串只是这里单行文档的语法糖:

$ msg="foo * bar"
$ read a b c <<EOF
> $msg
> EOF
$ echo "$a"
foo
$ echo "$b"
*
$ echo "$c"
bar
Run Code Online (Sandbox Code Playgroud)


tha*_*guy 9

要编写惯用脚本,您不能只查看每个单独的语法元素并尝试查找POSIX等效项.这就像通过用字典中的条目替换每个单词来翻译文本.

将已知有三个单词的字符串拆分为三个参数的POSIX方法,类似但不完全相同read:

var="newton apple tree"

set -f
set -- $var
set +f
a=$1 b=$2 c=$3

echo "$a was hit by an $b under a $c"
Run Code Online (Sandbox Code Playgroud)

  • 这不必要地覆盖了位置参数; 这里的字符串只是单行文档的快捷方式,因此不需要用`set`命令替换`read`. (2认同)

Cha*_*ffy 5

这并不漂亮,但作为通用解决方案,您可以使用命名管道解决此问题。

来自BashFAQ #24

mkfifo mypipe
printf '%s\n' "$msg" >mypipe &
read -r a b c <mypipe
Run Code Online (Sandbox Code Playgroud)

printf比 更可靠/更明确echo;如果您的消息仅包含例如-E-n.


也就是说,对于您在这里所做的事情,您可以只使用参数扩展:

a=${msg%% *}; msg=${msg#* }
b=${msg%% *}; msg=${msg#* }
c=${msg%% *}; msg=${msg#* }
Run Code Online (Sandbox Code Playgroud)