【问题标题】:How do you split a string from shell-redirect or `read`?如何从 shell-redirect 或 `read` 中拆分字符串?
【发布时间】:2016-03-11 13:48:20
【问题描述】:

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

以下在我的主机系统上工作,但是当我通过 ssh 登录到我的 ubuntu 虚拟机时,我的 bash 版本错误。无论我尝试什么,

我知道我可以在我的主机 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 新手。

【问题讨论】:

标签: bash split ifs


【解决方案1】:

您的第一次失败尝试是因为&lt;&lt;&lt;&lt; 是不同的运算符。 &lt; 打开指定文件。

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

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

【讨论】:

    【解决方案2】:

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

    $ 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 =)
    

    【讨论】:

    • 这两个都在我的 mac 上工作,但是给我一个错误的替换/非法选项 - vm 上的一个错误
    • 已发布替代方案。祝你好运!
    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2023-04-02
    • 2014-04-16
    • 2020-12-01
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多