【问题标题】:storing output of echo in a variable将 echo 的输出存储在变量中
【发布时间】:2014-07-02 05:46:04
【问题描述】:

我正在使用 echo 和 sed 在两个字符串之间打印一个字符串,但它给了我错误“没有这样的目录文件”

$SEARCH_1=12  
$FO_FILE=myfile.txt

SEARCH=$(head -$SEARCH_1 $FO_FILE | tail -1 | grep BShare)  
LOC=echo $SEARCH_2 | sed 's/\(.*\)BShare>\(.*\)<\/BShare\(.*\)/\2/g'

如果我不使用 LOC= 并且只使用 echo 它会正确打印字符串。 例子

<test>mystring</test> will be printed as mystring  

但是如果我将 echo 命令分配给一个变量,它会显示“没有这样的文件或目录”

【问题讨论】:

  • 什么是 SEARCH_2?没有赋值给它,它怎么能给出正确的结果?
  • 分配变量时不要使用美元符号:search_1=12; fo_file=myfile.txt。我强烈建议你不要使用 ALL_CAPS_VARNAMES,将它们留给 shell 使用——有一天你会写 PATH=5 并想知道为什么你的脚本被破坏了。
  • 您为什么认为分配给SEARCH(您使用$(...))和分配给LOC(您不使用)之间存在差异?

标签: shell sh


【解决方案1】:

要捕获命令的输出并将其分配给您需要使用反引号或$( ... ) 的变量,例如

LOC=`echo $SEARCH_2 | sed 's/\(.*\)BShare>\(.*\)<\/BShare\(.*\)/\2/g'`

LOC=$(echo $SEARCH_2 | sed 's/\(.*\)BShare>\(.*\)<\/BShare\(.*\)/\2/g')

原来命令的问题

LOC=echo $SEARCH_2 | sed 's/\(.*\)BShare>\(.*\)<\/BShare\(.*\)/\2/g'

是这里的 shell 尝试运行 $SEARCH_2 评估的结果(环境变量 LOC 设置为值 echo),并将其输出通过管道传递给 sed。

【讨论】:

  • 不推荐反引号。 $(...) 更容易阅读 (IMO) 并且更容易嵌套。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2013-06-21
  • 2022-01-09
  • 2018-01-27
  • 2023-02-13
  • 2011-10-08
相关资源
最近更新 更多