关于linux:Shell脚本使用多个文件

Shell Script working with multiple files

本问题已经有最佳答案,请猛点这里访问。

我有以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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脚本永远不会看到*。相反,它会得到一个参数列表。

您可以使用如下结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/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循环中这样做,直到参数列表为空,您将通过l论点。

顺便说一下,你最初的任务有几个问题:

  • 您不能假定文件名有扩展名,您的代码可以与某个目录路径中的点匹配。
  • 您的目录分配似乎正在拆分。代替/
  • 如果没有给出绝对或相对路径(即只有一个空文件名),则目录分配将包含文件名。

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


将代码包装成一个循环。也就是说,不是:

1
2
filename=$1
: code goes here

用途:

1
2
3
for filename in"$@"; do
  : put your code here
done