Bash脚本生成正确的$cmd,但无法执行复杂流

Bash脚本生成正确的$cmd,但无法执行复杂流,bash,cut,Bash,Cut,这个简短的脚本每天刮取一些日志文件来创建一个简单的摘录。它可以从命令行工作,当我回显$cmd和复制/粘贴时,它也可以工作。但当我试图从脚本本身执行时,它会中断 我知道这是一个我可能会改进的模式的噩梦,但我是否错过了一些简单的方法来正确执行它 #!/bin/bash priorday=$(date --date yesterday +"%Y-%m-%d") outputfile="/home/CCHCS/da14/$priorday""_PROD_message_processing_times.

这个简短的脚本每天刮取一些日志文件来创建一个简单的摘录。它可以从命令行工作,当我回显$cmd和复制/粘贴时,它也可以工作。但当我试图从脚本本身执行时,它会中断

我知道这是一个我可能会改进的模式的噩梦,但我是否错过了一些简单的方法来正确执行它

#!/bin/bash
priorday=$(date --date yesterday +"%Y-%m-%d")
outputfile="/home/CCHCS/da14/$priorday""_PROD_message_processing_times.txt"
cmd="grep 'Processed inbound' /home/rules/care/logs/RootLog* | cut -f5,6,12,16,18 -d\" \" | grep '^"$priorday"' | sed 's/\,/\./' | sed 's/ /\t/g' | sed -r 's/([0-9]+\-[0-9]+\-[0-9]+)\t/\1 /' | sed 's/  / /g' | sort >$outputfile"
printf "command to execute:\n"
echo $cmd
printf "\n"
$cmd
输出:

./make_log_extract.sh要执行的命令:grep'Processed inbound'/home/rules/care/logs/RootLog.log/home/rules/care/logs/RootLog.log.1 /home/rules/care/logs/RootLog.log.10 /home/rules/care/logs/RootLog.log.11 /home/rules/care/logs/RootLog.log.12 /home/rules/care/logs/RootLog.log.2 /home/rules/care/logs/RootLog.log.3 /home/rules/care/logs/RootLog.log.4 /home/rules/care/logs/RootLog.log.5 /home/rules/care/logs/RootLog.log.6 /home/rules/care/logs/RootLog.log.7 /home/rules/care/logs/RootLog.log.8 /home/rules/care/logs/RootLog.log.9 | cut-f5,6,12,16,18-d“| grep “^2014-01-30” 's/([0-9]+-[0-9]+-[0-9]+)\t/\1/'| sed's///g'|排序 /home/CCHCS/da14/2014-01-30\u生产消息\u处理\u times.txt

grep:5,6,12,16,18:没有这样的文件或目录

作为,不要存储命令,然后执行它

您可以执行它,但首先要打印它:

priorday=$(日期--昨天的日期+%Y-%m-%d)
outputfile=“/home/CCHCS/da14/$priorday”“\u PROD\u message\u processing\u times.txt”
设置-o xtrace#$outputfile”

set+o xtrace#基本上,尽量不要这样做:+1,
set-x
set-o xtrace
(如果有的话)之间有什么区别吗?从我在中看到的情况来看,完全一样。只是简短和长的符号。启动
bash
时也可以使用单字符shell选项:
bash-x
相当于启动
bash
然后执行
set-x
。谢谢;非常有用。我能够将该命令与print命令括在一起,然后通过每个管道命令来获得正确的语法:#grep'Processed inbound'/home/rules/care/logs/RootLog*| cut-f5,6,12,16,18-d'| grep'^“$priorday”| sed's/\,/\./'| sed's/\t/g';sed's/-r's([0-9]+\-[0-9]+\-[0-9]+\t/\1/''sed's///g'| sort>$outputfile grep'Processed inbound'/home/rules/care/logs/RootLog*| cut-f5,6,12,16,18-d''grep'^$priorday'./'./'./''sed's//\t/g'.\sed's/\t/g'.-sed-r's/([0-9]+-[0-9]+]\t/\1/'| sed's///g'| sort>$outputfile`@DaveA将命令存储在变量中也存在此问题,变量扩展可能会更改,等等。此外,由于您是新来的,如果您的问题已经解决,请不要忘记将答案标记为已接受。您可以单击答案旁边的复选标记将其从空切换到空给格林。看看你是否有任何疑问!
priorday=$(date --date yesterday +"%Y-%m-%d")
outputfile="/home/CCHCS/da14/$priorday""_PROD_message_processing_times.txt"

set -o xtrace # <-- set printing mode "on"
grep 'Processed inbound' /home/rules/care/logs/RootLog* | cut -f5,6,12,16,18 -d\" \" | grep '^"$priorday"' | sed 's/\,/\./' | sed 's/ /\t/g' | sed -r 's/([0-9]+\-[0-9]+\-[0-9]+)\t/\1 /' | sed 's/  / /g' | sort >$outputfile"
set +o xtrace # <-- revert to normal