2014-09-04 239 views
1

我试图将命令的输出传递给变量。 尝试了很多报价,但不成功,请检查将命令的输出传递给shell脚本中的变量

我正在读取$ line中的文件输入并处理它,试图将输出保存在变量a中。

set a="$($line|cut -d'-' -f 2|cut -d'.' -f 1|sed 's/[^0-9]*//g’)" 

回答

1

使用echo

a="$(echo $line|cut -d'-' -f 2|cut -d'.' -f 1|sed 's/[^0-9]*//g')" 
2

有几件事情。

首先是你不应该使用set,那是shell变量而不是环境变量。

其次,除非$line是一个实际命令,需要呼应它

第三,sed命令的结束报价是错误的类型,而不是'

所以,你应该用:

pax> line="date=2014.09.05-time=12.34.56" 
pax> a="$(echo $line|cut -d'-' -f 2|cut -d'.' -f 1|sed 's/[^0-9]*//g')" 
pax> echo $a 
12 

其抓住第二-分隔场(time=12.34.56),那么第一:

a="$(echo $line|cut -d'-' -f 2|cut -d'.' -f 1|sed 's/[^0-9]*//g')" 

您可以在下面的成绩单看到这个动作.time=12)的分隔字段,然后剥离开始处的所有非数字,仅给出12

+0

或者,使用这里的字符串:'cut -d'-'-f 2 <<<“$ line”'。 – 2014-09-04 04:17:54

+0

什么是shell变量?无论如何,'set a = 42'将'$ 1'设置为字符串'a = 42',这当然不是OP所要求的,但似乎并不符合为什么它“不起作用” ...另外,它可能应该是'echo'$ line“'。 – rici 2014-09-04 06:11:10

0

假设$filename是文件名,你从阅读,你几乎没有:

a="$(<$filename cut -d'-' -f 2|cut -d'.' -f 1|sed 's/[^0-9]*//g')" 

的问题是:

  • 调用set,这是没有帮助
  • 不正确的读取文件($line执行它,你想读取它。
  • 错误报价后//g - 你想要一个简单的单引号(')这里
+0

感谢您的回复!但我想逐行阅读$ filename ...这也适用于这...我还没有尝试代码 – Pankaj 2014-09-04 12:05:23

0

而不是用很长的多工艺管道,使用由壳本身提供的参数扩展工具。

tmp1=${line#*-} # Remove everything up to and include the first - 
tmp2=${tmp1%%.*} # Remove everything from the first . onward 
a=${tmp2//[!0-9]} # Remove anything that isn't a numerical digit 

如果从文件中读取,你可以折叠的第一步到读取命令本身

while IFS=- read first second rest; do 
    tmp=${second%%.*} 
    a=${tmp//[!0-9]} 
done 

这也可能是简单定义一个正则表达式来捕获字符串的一部分你想要的(样本行将有助于定义这样的正则表达式)。

[[ $line =~ $regex ]] && a=${BASH_REMATCH[1]} # Assuming the first capture group