我有一个看起来像这样的变量:
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)
要编写惯用脚本,您不能只查看每个单独的语法元素并尝试查找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)
这并不漂亮,但作为通用解决方案,您可以使用命名管道解决此问题。
来自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)