在包含*

时间:2019-02-18 14:50:50

标签: bash shell scripting

我有一个文件,该文件是由另一个具有文件名的脚本创建的。唯一的是,对于相似的文件名,它包含*。现在我想对该文件进行for循环以执行一些操作,但是我想在不同的服务器上执行该操作,因为我只需要该文件中的名称完全相同即可。为此,我使用了grep并将其传递给“ for”循环,一次执行一次。但是相反,在进行循环之前,它实际上是在当前服务器本身上执行它并给出错误的输出。我不知道我在想什么。

# node_name=auxiliary;grep -F $node_name /opt/log_automation/ME_log_sheet.csv|awk -F "," '{print $2}'
/opt/tpa/logs/install_SPS.*.log
/opt/tpa/logs/localization.log
/opt/tpa/logs/SPI.*.log
/opt/tpa/logs/TPA_system.log
#

这似乎按预期方式工作,因为我希望*以名称形式出现。现在,如果我将其放在变量中或将其传递给循环,它会扩展并提供我不想要的实际当前文件。我希望它只返回带有*的名称。

# node_name=auxiliary;myvar=$(grep -F $node_name /opt/log_automation/ME_log_sheet.csv|awk -F "," '{print $2}');echo $myvar
/opt/tpa/logs/install_SPS.2019.02.09-12:12.log /opt/tpa/logs/localization.log /opt/tpa/logs/SPI.2019.02.09-12:10.log /opt/tpa/logs/TPA_system.log

# node_name=auxiliary;for i in $(grep -F $node_name /opt/log_automation/ME_log_sheet.csv|awk -F "," '{print $2}');do echo $i;done
/opt/tpa/logs/install_SPS.2019.02.09-12:12.log
/opt/tpa/logs/localization.log
/opt/tpa/logs/SPI.2019.02.09-12:10.log
/opt/tpa/logs/TPA_system.log

请帮助我解决此问题。我究竟做错了什么? 附言:经过几次更改后,我添加了带有-grep的'-F'。两种方法都没有用。

2 个答案:

答案 0 :(得分:3)

引用所有变量:

node_name=auxiliary
for i in "$(grep -F $node_name /opt/log_automation/ME_log_sheet.csv|awk -F "," '{print $2}')"
do
    echo "$i"
done

答案 1 :(得分:0)

我认为您应该使用set -f来禁用文件名扩展:https://unix.stackexchange.com/questions/333867/what-does-set-f-in-korn-shell-do

但是,正如三元组所建议的那样,在文件名中使用此类字符(例如星号)是一种非常糟糕的做法。