我有以下bash脚本(最小化):调用" myScript"
#!/usr/bin/env bash
for var in 01 02 03 04 05 06 07 08 09 10
do
sed -e "s/\\begin{document}/\\begin{document}\\\include{fileName_${var}}/g" fileName_MAIN.tex>xfileName_MAIN_$var.tex
done
我通过在终端中键入myScript
来调用此方法。它工作(嗯,完整的脚本)。我想要的是将脚本用于不同的文件名。目前,脚本的文件名已经硬编码为fileName。如何提取" fileName"的使用? (在前面附加一个x时发生三次)到一个变量,以便我输入一个终端myScript newFileName
?
我认为我说我想要" lambda extract"。
答案 0 :(得分:1)
#!/usr/bin/env bash
for file in "$@"
do
for var in 01 02 03 04 05 06 07 08 09 10
do
sed -e "s/\\begin{document}/\\begin{document}\\\include{${file}_${var}}/g" \
${file}_MAIN.tex > x${file}_MAIN_${var}.tex
done
done
代码遍历所有文件名参数("$@"
),并且每个参数都会运行${file}
出现在fileName
最初出现位置的命令。
这意味着您可以使用:
myScript newFileName oldFileName spareFile otherFile
并处理所有4个文件。请注意,如果您尝试过,事情会变得混乱:
myScript /why/did/this/fail/filename
如果重要的是有效,那么就有办法解决它。
如果我希望for循环只能达到05,那么如何调整它有两个参数呢?
您必须决定如何调用该命令。在我看来有两个主要选择:
myScript 5 file1 [file2 ...]
myScript [-n 5] file1 [file2 ...]
在第一个中,您始终必须指定范围的上端。在第二个中,您可以省略一个数字(大概会默认为10)。我认为这是更好的方法 - 期望将数字映射到10的现有脚本可以正常工作。因此,您需要使用getopts
。
#!/bin/bash
number=10
while getopts n: arg
do
case "$arg" in
(n) number=$OPTARG;;
(*) echo "Usage: $0 [-n number] file [...]" >&2; exit 1;;
esac
done
shift $(($OPTIND - 1))
for file in "$@"
do
for var in $(seq -f '%02.0f' 1 $number)
do
sed -e "s/\\begin{document}/\\begin{document}\\\include{${file}_${var}}/g" \
${file}_MAIN.tex > x${file}_MAIN_${var}.tex
done
done
我很高兴地假设您不需要在大于99的数字上使用前导零,并且您将在-n
之后提供一个数字。如果你不这样做,GIGO - Garbarge In,Garbage Out。如果其他人打算使用它,你需要更加保护并验证该数字实际上是一个数字等。但是,对于一般用户来说,更大的问题是检查文件名的约束,确保所有实际存在的文件确实存在。因此,我不认为这个问题是严重的;这是一个个人使用的脚本。
答案 1 :(得分:0)
在bash中,您可以访问positional parameters($ 0,$ 1 .. $ n)。
$0
是您调用的脚本的名称,$1
是传递的第一个参数。 $2
是第二个参数,它继续。当你到达第十个参数时,你必须将数字包装在括号中,如下所示:${10}
。
虽然这只适用于1个文件,但是像这样修改脚本会允许您调用它:myScript file
。
for var in 01 02 03 04 05 06 07 08 09 10
do
sed -e "s/\\begin{document}/\\begin{document}\\\include{$1_${var}}/g" \
$1_MAIN.tex > x$1_MAIN_${var}.tex
done