2012-10-22 50 views
0

好的这个答案可能很简单,但我一直在寻找一段时间,我无法弄清楚。我有一个名为“tmessagef”的变量。变量的格式如下:在BASH中将一行回声保存到变量中?

value1*value2*vlaue3*value4*value5 

我想要的变量的唯一部分是值5.我目前使用下面的代码,但只打印每个值,并且不将它们保存到一个变量:

OIFS=$IFS 
IFS='*' 
arr2=$tmessagef 
for x in $arr2 
do 
    echo "$x" 
done 
IFS=$OIFS 

我想要做的是获取echo命令产生的5日线和保存到一个名为“tmessage”变量。我会如何去做这件事?

在此先感谢。

+1

变化 '回声' 到 'tmessage =' – mcalex

+0

@Rohan你是什么意思? – NStorm

+2

将'echo“$ x”'更改为'val =“$ x”'。在循环结尾'$ val'将包含最后一个值。 –

回答

0

相信mcalex的评论应该回答这个问题:

变化echo "$x"tmessage="$x"。在循环$ val的结束将包含一个值

+0

我认为mcalex先到那里 – mcalex

+0

哎呦,修正:) – JJJollyjim

0

你能使用剪切?

VAL=`echo 'value1*value2*vlaue3*value4*value5' | cut -f5 -d'*'` 
+0

'$ VAL ='是错误的。删除'$'。另外'剪切'不是bash! –

+0

yes cut不是bash,但通常可以通过组合已经提供的简单工具来实现所需的功能。Yup $ VAL =应该是VAL =,已编辑。 – foamdino

+0

如果我们修复语法,这是最直接的答案。在bash中,我们可以写'val = $(cut -d \ * -f5 <<<“$ line”) ' –

1

数组操作:

OIFS="$IFS" IFS='*' Y=($X) 
x=${Y[${#Y[@]}-1]} 
IFS="$OIFS" 
+0

不是。它会变成绿色的。 – ormaaj

+0

@ormaaj:适合我... – nneonneo

+0

因为您的测试值不包含例如'[0-9]'在当前目录中有一个名为'5'的文件。应该避免与IFS分开。 – ormaaj

1

对于这种非常特殊的情况下(在这里你只需要提取在最后的值),则可以使用参数扩展

echo "${word##*\*}" 

或将其分配给变量而不是使用“echo”。

说明

  • ##除去在相匹配的图案
  • *匹配任何数目的任何字符的
  • \*相匹配的文字星号
开始锚定的最长子串

所以基本上,删除最长的子以星号结尾的环。