1

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

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

我知道我可以在我的主机 mac os x 系统上使用 IFS,如下所示:

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" | ...但我无法让它工作 - 如下:

#Fails
    IFS='=' read -ra myarray -d '' <"$var"
    echo ${array[0]} ${array[1]]}

#Fails
    echo "$var" | IFS='=' read -a array
    echo ${array[0]} ${array[1]]}

#fails
echo "a=b" | IFS='=' read -a array
declare -p array
echo ${array[0]} ${array[1]}

感谢任何指针,因为我对 bash 真的很陌生。

4

2 回答 2

3

您的第一次失败尝试是因为<并且<<<是不同的运营商。<打开命名文件。

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

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

于 2016-03-11T13:59:29.433 回答
2

您的尝试被混淆了,因为您必须在与read.

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

如果您希望您的变量持久(即,在子外壳范围之外):

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

显然,它并不漂亮。


更新:如果-a缺少,则表明您不在阵列领域。您可以尝试参数替换:

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

如果这不起作用,请回退到好的 ole cut:

str='foo=bar'
var=$(echo $str | cut -f 1 -d =)
val=$(echo $str | cut -f 2 -d =)
于 2016-03-11T13:59:42.467 回答