-1

Linux Debian bash。我有一个要操作的 PATH 类型变量“X”。'X' 可以是由“:”分隔的任意数量的元素,例如,使用水果:

set X=apple:pear:orange:cherry

我如何提取第一个元素减去其分隔符,将其保存到新变量“Y”中,然后从“X”中删除它及其分隔符。如在..

apple:pear:orange:cherry

变成

Y=apple X=pear:orange:cherry

我看过 bash 替换备忘单,但令人难以置信。Sed 也是一种方式,但我似乎永远无法摆脱分隔符。

我确实做到了这一点

IFS=: arr=($X)
Y=${arr[0]}
cnt=${#arr[@]}
IFS=

这不是很远,但至少我得到了 Y,但它对 X 没有任何作用。老实说,我无论如何都不理解它们,只是使用了备忘单。因此,将不胜感激提供解决方案的解释。

4

2 回答 2

1

你可以:

X=apple:pear:orange:cherry
IFS=: read -r Y X <<<"$X"    # note - will fail with newlines
declare -p Y X
# declare -- Y="apple"
# declare -- X="pear:orange:cherry"

read会将第一个元素分配给Y,然后将其余的分配给X. 有关更多信息,请参阅read您的 shell 的文档和文档,尤其是bash手册man 1p readPOSIX read

但是使用带有拆分的数组也可以。有趣的事实 - 它可以是一条线。

X=apple:pear:orange:cherry
IFS=:
arr=($X)
Y=${arr[0]}
X="${arr[*]:1}"
declare -p Y X
# declare -- Y="apple"
# declare -- X="pear:orange:cherry"

($X)将进行分词扩展并分配一个数组。随着${arr[0]第一个元素被提取。使用 IFS 中的第arr[*]一个字符连接数组元素并使用${ :1}扩展提取除第一个之外的所有元素,请参阅shell 参数扩展

于 2020-11-14T23:07:37.790 回答
1

您可以将冒号分隔的字符串拆分为一个数组,对其进行操作,然后重建一个新字符串:

#!/usr/bin/env bash

x=apple:pear:orange:cherry

echo "x is $x"


IFS=:
# Split x up into an array using the value of IFS as the delimiter.
read -r -a xarr <<< "$x"
# Assign the first element to y
y=${xarr[0]}
# And remove it from the array.
unset "xarr[0]"
# Rebuild x without the first element.
x="${xarr[*]}"
unset -v IFS

echo "y is $y and x is now $x"
于 2020-11-14T23:07:54.213 回答