我的代码如下:
#!/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
我该怎么办?使用星号。
感谢您的时间!
答案 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));