bash将值传递给命令

bash将值传递给命令,bash,parameter-passing,concatenation,backticks,Bash,Parameter Passing,Concatenation,Backticks,我有一个变量,我想把它的值传递给一个命令。然而,美元正在产生不同寻常的结果。它看起来像一个*并搜索所有目录。我的代码是: "Please enter the test type: " read test result="pass" search_result=`find ./logs/$test_2017_01_logs*/* -type f -name func_log -exec egrep $result {} \;` echo "$search_result" 我只想搜索用户读入的

我有一个变量,我想把它的值传递给一个命令。然而,美元正在产生不同寻常的结果。它看起来像一个*并搜索所有目录。我的代码是:

"Please enter the test type: "
read test

result="pass"
search_result=`find ./logs/$test_2017_01_logs*/* -type f -name func_log -exec egrep $result {} \;`

echo "$search_result"
我只想搜索用户读入的目录后缀,而不是我的代码正在执行的所有目录

这个问题是由于传入值($test)和文件夹名称的其余部分(_2017_01_logs*)的串联造成的吗?

是一个“字字符”(
[a-zA-Z0-9_u]
),被理解为您正在寻址的变量的一部分,因此是未定义的
$test\u 2017_01_logs

为了避免这种情况,可以将变量名括在花括号中:

find ./logs/"${test}_2017_01_logs"*/* -type f -name func_log -exec egrep $result {} \;
或者,如果我们遵循查尔斯·达菲的忠告:

find ./logs/"$test"_2017_01_logs*/* -type f -name func_log -exec egrep -h -e "$result" /dev/null {} +
是一个“字字符”(
[a-zA-Z0-9\
),被理解为您正在寻址的变量的一部分,因此是未定义的
$test\u 2017\u 01\u日志

为了避免这种情况,可以将变量名括在花括号中:

find ./logs/"${test}_2017_01_logs"*/* -type f -name func_log -exec egrep $result {} \;
或者,如果我们遵循查尔斯·达菲的忠告:

find ./logs/"$test"_2017_01_logs*/* -type f -name func_log -exec egrep -h -e "$result" /dev/null {} +

可能还想在
$result
周围添加引号,这样它就不会被分词(第一个以外的词会被解释为额外的文件名)。我还建议
-exec egrep-h-e“$result”/dev/null{}+
——这样我们就不会运行
grep
超过需要的次数,而且(由于前面的
-e
)将
result
解释为文字字符串,即使它以破折号开头。(
-h
抑制输出中的文件名,以获得与当前使用相同的行为,即使在传递多个名称时也是如此;如果需要,请将其删除)…之所以存在
/dev/null
,是因为
grep
在某些情况下会根据传递的文件名数量更改其行为;无论有多少结果
find
添加到命令行中,如果使用
xargs
重用该习惯用法,那么我们不会从stdin中读取实例,并在0-results-find情况下调用它(IIRC,MacOS实现就是其中之一)。哦,如果
$test
包含空格或全局字符,这些字符应该被视为文字(包括方括号),你也需要引用。
/logs/“$test”\u 2017\u 01\u logs*/*
可以,或者
“/logs/${test}\u 2017\u 01\u logs”*/*
--唯一需要确定的是,我们没有引用
*
sMight,我们还希望在
$result
周围添加引号,这样它就不会被拆分(第一个文件名以外的单词会被解释为其他文件名)。我还建议
-exec egrep-h-e“$result”/dev/null{}+
——这样我们就不会运行
grep
超过需要的次数,并且(由于前面的
-e
)将
结果解释为文本字符串,即使它以破折号开头。(
-h
禁止输出中的文件名,以获得与当前使用相同的行为,即使传递了多个名称;如果需要,请将其取出)…之所以存在
/dev/null
,是因为
grep
在某些情况下会根据传递的文件名的数量而改变其行为;它的存在确保了无论有多少结果
find
添加到命令行,您都能获得一致的行为,这意味着如果习惯用法与
xargs
一起重用,我们就不会在0-results-found的情况下(IIRC,MacOS实现就是其中之一),用一个实现从stdin读取一个实例。哦,如果
$test
包含空格或glob字符,这些字符应该被视为文字(包括方括号),你也需要引用。
/logs/“$test”_2017年的日志*/*
就可以了,或者
“/logs/${test}”\u 2017年的日志*/*
——唯一可以确定的是我们没有引用
*