我有一个命令gennlm.sh,它需要两个参数 - 输入文件和输出文件夹。我想获取目录中的每个文件,使用这些文件进行输入,然后转换每个输入文件名以提供输出文件夹,并将其全部设置为cronjob。这就是我到目前为止所做的:
10 */6 * * * for file in /var/www/parsingdev/corpus/*; do bash /var/www/parsingdev/meTypeset/tools/gennlm.sh $file '$file | sed -e "s/.*\//\/var\/www\/parsingdev\/output\//g" -e "s/\.docx//g"'; done
但是,我试图让第二个参数工作,并且所有的子串函数都嵌套在''中似乎有一些问题,因为预期的字符串参数没有按预期传递给gennlm.sh脚本。介意澄清我需要做些什么来使这项工作?谢谢!
答案 0 :(得分:0)
您不能在单引号中使用变量。
相反,做
10 */6 * * * for file in /var/www/parsingdev/corpus/*; do fileX=${file%.docx}; bash /var/www/parsingdev/meTypeset/tools/gennlm.sh ${fileX##*/}; done
我希望我理解你原来命令中的无意义:
'$file | sed -e "s/.*\//\/var\/www\/parsingdev\/output\//g" -e "s/\.docx//g"
“双引号”每个扩展,以及任何可能包含特殊字符的内容,例如: “$ var”,“$ @”,“$ {array [@]}”,“$(command)”。使用“单引号”来制作文字,例如。 '花费5美元'。请参阅http://mywiki.wooledge.org/Quotes,http://mywiki.wooledge.org/Arguments和http://wiki.bash-hackers.org/syntax/words。
答案 1 :(得分:0)
如果我理解正确,你的sed应该取文件的基名并删除它的.docx
扩展名(如果有的话),并在它前面添加一个路径。那么,既然你已经发布了bash,为什么不用bash做所有事情呢?
for file in /var/www/parsingdev/corpus/*; do bash -c 'out=${1##*/}; /var/www/parsingdev/meTypeset/tools/gennlm.sh "$1" "/var/www/parsingdev/output/${out%.docx}"' _ "$file"; done
或者真的是bash中的所有内容:
bash -c 'for file in /var/www/parsingdev/corpus/*; do out=${file##*/}; /var/www/parsingdev/meTypeset/tools/gennlm.sh "$file" "/var/www/parsingdev/output/${out%.docx}"; done'