我有以下代码:
#!/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
我该怎么做?使用星号。
感谢您的宝贵时间!
首先意识到 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
,以前是 $3
现在是 $2
,等等。通过在 while 循环中执行此操作,直到参数列表为空,您将通过所有的论据。
顺便说一下,您的初始作业有几个问题:
- 您不能假设文件名有扩展名,您的代码可以匹配某个目录路径中的点。
- 您的目录分配似乎在 .而不是/
- 如果没有给出绝对或相对路径,您的目录分配将包含文件名,即只有一个裸文件名
- ...
我认为你应该多花一点时间在鲁棒性上