我正在尝试按如下方式存储命令的输出:
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
但它没有返回任何东西。
我是否遗漏了某些内容,或者这些表达方式是否恰当?
答案 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问题的答案以获取更多详情。
sh abc_port=$(the_command)
根据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
"the_command"
这只是一个引用的论点。第一个参数被解释为要执行的命令。所以shell尝试在the_command
中找到$PATH
可执行文件并启动它。如果你愿意,你可以用双引号包装任何参数。例如,"ls" -l
与ls -l
具有相同的效果。
答案 1 :(得分:0)
你好用猫用grep试试 前 -
abc_port=$("find ./ -type f -name '*.yml' -exec cat {} \;|grep abc_solution_portbase: | cut -d: -f2")