linux - 处理多个文件的 Shell 脚本

标签 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

我该怎么做?使用星号。

感谢您的宝贵时间!

最佳答案

首先意识到 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 循环中执行此操作,直到参数列表为空,您将通过所有的论据。

顺便说一下,您的初始作业有几个问题:

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

我认为你应该多花一点时间在鲁棒性上

关于linux - 处理多个文件的 Shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46430035/

相关文章:

linux - 即使文件系统已满,那么linux系统也能正常工作。这是怎么发生的?

linux - diff 命令标签格式

linux - 如何检查应用程序是否在服务器中启动并运行?

带有引用文本文件中 id 的变量的 linux 脚本或 mass citrix vm snapshot delete

bash - 运行在 bash 中存储为字符串的 PSQL 查询

linux - Xlib xinput 测试设备状态是否挂起

c - execv() 的路径查找

linux - bash 脚本中的语法错误 `("意外

shell - 如果文本不存在,SED 脚本如何在行号处插入行?

unix - 启动一项在我的终端 session 结束时不会结束的作业?