从bash脚本中提取变量

时间:2015-02-08 16:46:46

标签: bash

我有以下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"。

2 个答案:

答案 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