我尝试拆分键值对(围绕一个=符号),然后使用bash编辑配置文件。但我需要替代<<<< IFS的语法。
以下适用于我的主机系统,但是当我通过ssh登录我的ubuntu虚拟机时,我的bash版本错误。无论我尝试什么,<<<失败。 (我肯定在文件顶部调用正确版本的bash,使用#!/ bin / bash(我也试过#!/ bin / sh等)。)
我知道我可以在我的主机mac os x系统上使用IFS:
const
但这对我的虚拟机无效。
我也知道我应该可以切换<<<语法通过反引号,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。
答案 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 =)