在简单的shell脚本中将文件作为参数传递的最简单方法是什么?

时间:2010-08-16 19:32:31

标签: python shell

以下在Mac OS X上运行正常:

#!/bin/bash
R CMD Sweave myfile.Rnw
pdflatex myfile.tex
open myfile.pdf

现在,我意识到这3行代码对我的工作非常有帮助 - 与某些特定文件无关。因此,我想将该文件用作参数。我知道如何使用一个参数本身,但是在字符串之后拆分输入并在之后连接它时会出现问题。如果我能够将文件名参数拆分为:

split($1,".") # return some array or list ("name","ext")

或者是否有比在shell脚本中使用Python更简单,完全不同的方式?

提前获取任何一般性建议和示例!

5 个答案:

答案 0 :(得分:6)

我在python中执行所有shell脚本编写 它更容易阅读,更强大,也适用于Windows。

答案 1 :(得分:6)

您可以将基本名称作为参数,并使用$1.Rnw$1.tex$1.pdf。 Python非常适合shell脚本,但我通常坚持使用bash来处理不到10行的事情。

如果您确实想要获取文件名,可以使用cut -f 1 -d '.' $1

答案 2 :(得分:2)

Python one liner应该是:

python -c "print '$1'.split('.')[0]"

但Nathon的想法是“使用基本名称作为参数。”恕我直言是最好的解决方案。

修改

使用“反引号”来使用程序放在标准输出上的文本,如下所示:

eike@lixie:~> FOO="test.foo"
eike@lixie:~> BAR=`python -c "print '$FOO'.split('.')[0]"`
eike@lixie:~> echo $BAR

这应该导致:

test

答案 3 :(得分:1)

我同意Gerald关于使用Makefiles的建议,但他的缺点评论(每个项目的专用makefile)并不完全正确,因为Makefile可以变得更通用。

用$ @替换$(FILE),然后用“make foo”调用。

我将此作为对杰拉尔德答案的评论,但没有必要这样做。

答案 4 :(得分:0)

Python当然是shell脚本的一个很好的选择,但是对于一个简单的例子,因为你使用bash更容易。再次,为了编译LaTeX,我建议使用makefile并使用GNU make。如果你还没有听说过,你可以这样做:

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 /

make

或建成后清理

make clean

缺点是你需要为你的每个项目提供一个专用的makefile,但是有一个不是很大问题的模板。 HTH

PS:可以在http://www.faqs.org/docs/abs/HTML/string-manipulation.html找到对bash shell进行字符串操作的精彩介绍。