Answers:
尝试这种方式:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x显示的值x。awk '{print $2}'打印先前显示的第二个字段x。$(... )保留输出,然后将其分配给y。echo $x是不 显示的值x。printf '%s\n' "$x"将会。
awk '{print $2}'打印先前显示的每一行的第二个字段x。
假设您要提取的子字符串之前至少有一个空格(并且该子字符串不包含任何空格),则可以通过简单的参数扩展来做到这一点:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
输出
[true]
echo除了不是以开头-且不包含任何转义序列的文字字符串之外,它不可移植。即使对于内置的bash,它的行为也有所不同,这取决于它的编译方式以及是否XPG_ECHO设置。假设该字符串不包含任何转义序列,这应该没问题,但printf '[%s]\n' "$y"还是更好。
echo,即使在这样的“扔掉”示例中,我也应该打破习惯来显示变量的值。
您可以使用awk:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF 当前记录中的字段数
使用sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
使用字符串表达式:
a="rtcpOnNbActive true"
echo ${a##* }
true
使用grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o仅给出完全匹配项,[a-z]+将匹配来自z的字母和$末尾的均值
echo除了不是以开头-且不包含任何转义序列的文字字符串之外,它不可移植。即使对于内置的bash,它的行为也有所不同,这取决于它的编译方式以及是否XPG_ECHO设置。同样,您应该始终对变量扩展和命令替换使用双引号(在某些例外情况下,虽然没有必要,但也没有任何害处)。使用OP之类的字符串,这应该没问题,但是如果要确保printf '%s\n' "${a##* }"会更好。
您可以使用read内置的
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read?不是read进行拆分,而是进行拆分$IFS。由于某些原因,很多人认为$IFS 只在read涉及时才可以拆分w / 。你可以这样做:set -f; IFS=' '; printf %.0s%s $x或什么的。无论如何-您需要在$IFS此处指定的值。
read使用进行拆分IFS,请查看文档。使用read的主要优点是它可以设置变量(这是OP的要求),并且由于它可以拆分字符串并填充数组,因此非常适合从字符串中提取任意字段。另外,我假设IFS这里是默认值,但是如果需要的话,很容易设置IFS=$' \n\t' read -r _ y <<<"$x"就可以解决问题
read分配,$IFS拆分。如果您想填充数组,请使用set-在这种情况下,您不需要人工的此处字符串废话。unset IFS获取默认的$ IFS行为。
x您要提取的子字符串之前是否总是会有空格?