【问题标题】:bash passing value into commandbash 将值传递给命令
【发布时间】:2023-04-05 14:43:01
【问题描述】:

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

"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*) 串联造成的吗?

【问题讨论】:

    标签: bash parameter-passing concatenation backticks


    【解决方案1】:

    _ 是一个“单词字符”([a-zA-Z0-9_]),被理解为您正在寻址的变量的一部分,因此是未定义的 $test_2017_01_logs

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

    find ./logs/"${test}_2017_01_logs"*/* -type f -name func_log -exec egrep $result {} \;
    

    或者,如果我们遵循 Charles Duffy 的明智建议:

    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 一起重用该惯用语,我们将不会从标准输入中获得具有实现的实例读取随后在 0-results-found 案例中调用(IIRC,MacOS 实现就是其中之一)。
    • 哦。如果$test 包含应该被视为文字的空格或全局字符(包括方括号),那么您也需要引用它。 ./logs/"$test"_2017_01_logs*/* 可以,或者"./logs/${test}_2017_01_logs"*/* - 唯一可以确定的是我们没有引用*s
    猜你喜欢
    • 2017-06-15
    • 1970-01-01
    • 2021-11-25
    • 2021-04-30
    • 2018-02-13
    • 2021-08-26
    • 2019-06-22
    • 2015-01-08
    • 2015-02-15
    相关资源
    最近更新 更多