What's the simplest way to pass a file as an argument in a simple shell script?
以下在Mac OS X上工作正常:
1 2 3 4 | #!/bin/bash R CMD Sweave myfile.Rnw pdflatex myfile.tex open myfile.pdf |
现在,我意识到这3行代码对我的工作非常有帮助——独立于某些特定的文件。因此,我想用这个文件作为一个参数。我知道如何使用参数本身,但在将输入拆分为字符串后再进行concat时遇到问题。如果我能够像这样拆分文件名参数:
1 | split($1,".") # return some array or list ("name","ext") |
还是有比在shell脚本中使用python更简单、完全不同的方法?
任何一般性的建议和例子都要提前提交THX!
你只需以基名作为参数,使用
如果您真的想取一个文件名,可以使用
我用python编写所有的shell脚本。它更容易阅读,功能更强大,也适用于Windows。
python一行程序是:
1 | python -c"print '$1'.split('.')[0]" |
但内森的想法"用基名作为论据"是最好的解决方案。
编辑:
您可以使用"backticks"来使用程序在标准输出上放置的文本,如下所示:
1 2 3 | eike@lixie:~> FOO="test.foo" eike@lixie:~> BAR=`python -c"print '$FOO'.split('.')[0]"` eike@lixie:~> echo $BAR |
这将导致:
1 | test |
我同意杰拉尔德使用makefile s的建议,但是他的负面评论(每个项目的专用makefile)并不完全正确,因为makefiles可以变得更通用。
用$@替换$(file),然后用"make foo"调用。
我将把这作为对杰拉尔德答案的评论,但没有必要这样做。
对于shell脚本来说,python无疑是一个不错的选择,但是对于一个简单的例子来说,使用bash更容易。同样,对于编译LaTex,我建议使用makefile并使用gnu make。如果你没有听说过,你可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | FILE = your_tex_filename INCLUDES = preface.tex introduction.tex framework.tex abbreviations.tex all: $(FILE).pdf $(FILE).pdf: $(FILE).tex $(INCLUDES) $(FILE).aux index bibliography pdflatex $(FILE).tex index: $(FILE).tex makeindex $(FILE).idx bibliography: $(FILE).bib $(FILE).aux bibtex $(FILE) $(FILE).aux: $(FILE).tex pdflatex $(FILE).tex # bbl and blg contain the bibliography # idx and ind contain the index .PHONY : clean clean: rm *.aux *.bak $(FILE).bbl $(FILE).blg \ *.flc *.idx *.ind *.log *.lof *.lot *.toc core \ *.backup *.ilg *.out *~ |
然后简单地编译源文档w/
1 | make |
或在W栋建筑后清理/
1 | make clean |
缺点是,您需要为每个项目都提供一个专用的makefile,但是w/a模板并不是什么问题。高温高压
PS:关于字符串操作的一个很好的介绍,请访问http://w w w.faqs.org/docs/abs/html/string-manipulation.html。