使用多个文件的Shell脚本

时间:2017-09-26 15:06:31

标签: linux shell

我的代码如下:

#!/bin/bash

filename=$1
file_extension=$( echo $1 | cut -d. -f2 )
directory=${filename%.*}

if [[ -z $filename ]]; then
    echo "You forgot to include the file name, like this:"
    echo "./convert-pdf.sh my_document.pdf"
else
    if [[ $file_extension = 'pdf' ]]; then
        [[ ! -d $directory ]] && mkdir $directory
        convert $filename -density 300 $directory/page_%04d.jpg
    else
        echo "ERROR! You must use ONLY PDF files!"
    fi
fi

它运作得非常好!

我想创建一个脚本,我可以这样做:./ script.sh * .pdf

我该怎么办?使用星号。

感谢您的时间!

2 个答案:

答案 0 :(得分:1)

首先要意识到shell会将*.pdf扩展为参数列表。这意味着您的shell脚本永远不会看到*。相反,它将获得一个参数列表。

您可以使用如下结构:

#!/bin/bash

function convert() {
  local filename=$1
  # do your thing here
}

if (( $# < 1 )); then
  # give your error message about missing arguments
fi
while (( $# > 0 )); do
  convert "$1"
  shift
done

这样做首先将您的功能包装在一个名为convert的函数中。然后对于主代码,它首先检查传递给脚本的参数的数量,如果小于1(即没有),则给出应该传递文件名的错误。然后你进入一个while循环,只要有剩下的参数就会执行。传递给convert函数的第一个参数,它执行脚本已经执行的操作。然后执行shift操作,这样做会抛弃第一个参数,然后将所有剩余的参数“左”移动一个位置,即$2现在是{{1} },$1现在是$3等等。通过在while循环中执行此操作直到参数列表为空,您将遍历所有参数。

顺便说一句,您的初始作业存在一些问题:

  • 你不能假设文件名有扩展名,你的代码可能会匹配某些目录路径中的点。
  • 您的目录分配似乎正在拆分。而不是/
  • 如果没有给出绝对或相对路径,你的目录分配将包含文件名,即只有一个裸文件名
  • ...

我认为你应该花更多时间在健壮性上

答案 1 :(得分:0)

将代码循环包装。也就是说,而不是:

 public void addAgeSorted(Person p){

使用:

Comparator<Person> foo = (o1, o2) -> Integer.compare(o1.getAge(), o2.getAge());

PriorityQueue<Person> queueOfPersons = new PriorityQueue<>(foo);

queueOfPersons.add(new Person(51));
queueOfPersons.add(new Person(23));
queueOfPersons.add(new Person(33));
queueOfPersons.add(new Person(1));