将shell命令的输出存储在变量

时间:2016-10-06 05:52:14

标签: bash shell grep

我正在尝试按如下方式存储命令的输出:

sh abc_port=$("find ./ -type f -name '*.yml' -exec grep abc_solution_portbase: {} \; | cut -d: -f2")

然而,它失败了:

-bash: find ./ -type f -name '*.yml' -exec grep abc_solution_portbase: {} \; | cut -d: -f2: No such file or directory

我也试过这样的事情:

"find ./ -type f -name '*.yml' -exec grep abc_solution_portbase: {} \; | cut -d: -f2" <<< $abc_port

但它没有返回任何东西。

我是否遗漏了某些内容,或者这些表达方式是否恰当?

2 个答案:

答案 0 :(得分:0)

解决方案

我会表达如下:

abc_port="$(find ./ -type f -name '*.yml' \
  -exec grep abc_solution_portbase: {} \; | cut -d: -f2)"

注意,主要思想是将$()表达式用双引号括起来:variable_name="$(your_command)"$()中的命令不应该解决您的特定YML解析问题。

<强>解释

在赋值中需要$()表达式周围的引号,因为$()表达式可能会返回一个解释为shell表达式的序列。例如,以下是无效的分配:

$ a=x y
bash: y: command not found

要分配x y字符串,您需要双引号或单引号:

a="x y"

阅读this问题的答案以获取更多详情。

关于您的尝试

  1. sh abc_port=$(the_command)
  2. 根据sh手册:

    sh [−abCefhimnuvx] [−o option]... [+abCefhimnuvx] [+o option]...
               [command_file [argument...]]
    
         

    sh实用程序是一个应该执行的命令语言解释器   命令从命令行字符串,标准输入或a读取   指定的文件。

    sh实用程序将abc_port=<result_of_the_command>序列解释为输入文件。您可以简单地测试它:

    $ echo 'echo hello' > 'a=b'
    $ sh a=b
    hello
    
    1. "the_command"
    2. 这只是一个引用的论点。第一个参数被解释为要执行的命令。所以shell尝试在the_command中找到$PATH可执行文件并启动它。如果你愿意,你可以用双引号包装任何参数。例如,"ls" -lls -l具有相同的效果。

答案 1 :(得分:0)

你好用猫用grep试试 前 -

abc_port=$("find ./ -type f -name '*.yml' -exec cat {} \;|grep abc_solution_portbase: | cut -d: -f2")