我有一个看起来像这样的变量:
msg="newton apple tree"
我想将每个单词分配到单独的变量中。这在bash中很容易做到:
read a b c <<< $msg
在POSIX shell中是否有一种紧凑,可读的方法?
答案 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
printf
比echo
更可靠/更好地指定;如果您的邮件仅包含-E
或-n
,则回显行为会因实施而异。
那就是说,对于你在这里做的事情,你可以使用参数扩展:
a=${msg%% *}; msg=${msg#* }
b=${msg%% *}; msg=${msg#* }
c=${msg%% *}; msg=${msg#* }