如何从shell-redirect或`read`拆分字符串?

时间:2016-03-11 13:48:21

标签: bash split ifs

我尝试拆分键值对(围绕一个=符号),然后使用bash编辑配置文件。但我需要替代<<<< IFS的语法。

以下适用于我的主机系统,但是当我通过ssh登录我的ubuntu虚拟机时,我的bash版本错误。无论我尝试什么,<<<失败。 (我肯定在文件顶部调用正确版本的bash,使用#!/ bin / bash(我也试过#!/ bin / sh等)。)

我知道我可以在我的主机mac os x系统上使用IFS:

const

但这对我的虚拟机无效。

我也知道我应该可以切换&lt;&lt;&lt;语法通过反引号,var="word=hello" IFS='=' read -a array <<<"$var" echo ${array[0]} ${array[1]]} #alternative -for calling through e.g. sh file.sh param=value for var in "$@" do IFS='=' read -a array <<<"$var" echo ${array[0]} ${array[1]]} done #alternative IFS='=' read -ra array <<< "a=b" declare -p array echo ${array[0]} ${array[1]} $(),但我无法使其工作 - 如下所示:

echo "$var" | ...

感谢任何指针,因为我真的很不喜欢bash。

2 个答案:

答案 0 :(得分:3)

您首次尝试失败是因为<<<<是不同的运营商。 <打开指定的文件。

第二个失败,因为read仅在管道启动的子shell中设置array的值;在管道完成后,shell退出,array随之消失。

第三个失败的原因与第二个失败的原因相同;后面的declare没有任何区别。

答案 1 :(得分:2)

您的尝试受到了混淆,因为您必须在与read 相同的子shell中使用变量

$ echo 'foo=bar' | { IFS='=' read -a array; echo ${array[0]}; }
foo

如果你想让你的变量持久(即在子shell范围之外):

$ var=$(echo 'foo=bar' | { IFS='=' read -a array; echo ${array[0]}; })
$ echo $var
foo

显然,它并不漂亮。

更新:如果缺少-a,则表示您已离开阵列。您可以尝试参数替换:

str='foo=bar'
var=${str%=*}
val=${str#*=}

如果这样做不起作用,那就回归好了:

str='foo=bar'
var=$(echo $str | cut -f 1 -d =)
val=$(echo $str | cut -f 2 -d =)