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

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!


你只需以基名作为参数,使用$1.Rnw$1.tex$1.pdf。python非常适合shell脚本,但我通常坚持使用bash来处理长度小于10行的内容。

如果您真的想取一个文件名,可以使用cut -f 1 -d '.' $1


我用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。