什么是POSIX shell等效于bash<<<

时间:2014-11-10 17:16:30

标签: bash sh

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

msg="newton apple tree"

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

read a b c <<< $msg

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

3 个答案:

答案 0 :(得分:12)

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

$ msg="foo * bar"
$ read a b c <<EOF
> $msg
> EOF
$ echo "$a"
foo
$ echo "$b"
*
$ echo "$c"
bar

答案 1 :(得分: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"

答案 2 :(得分:3)

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

来自BashFAQ #24

mkfifo mypipe
printf '%s\n' "$msg" >mypipe &
read -r a b c <mypipe

printfecho更可靠/更好地指定;如果您的邮件仅包含-E-n,则回显行为会因实施而异。


那就是说,对于你在这里做的事情,你可以使用参数扩展:

a=${msg%% *}; msg=${msg#* }
b=${msg%% *}; msg=${msg#* }
c=${msg%% *}; msg=${msg#* }