bash shell 脚本命令替换问题 - 转义基本文件名称空间 - 使用 ghostscript 将多个 pdf 文件转换为 jpeg

bash shell script command substitution problem - escape basefile name spaces - multiple pdf files to jpeg conversion using ghostscript

这个bashshell脚本 使用 zenity 获取多个 .pdf 文件输入并存储在数组中以进行 ghostscript .pdf 到 .jpeg 的转换。

问题

  1. 需要存储在带有转义空格的数组中的文件路径才能进入 gs 命令 $i
  2. 在 for 循环内的 gs 命令中需要输出文件名的基本文件名
  3. gs 命令需要带转义空格的文件名。
  4. 无法运行第20行找不到gs命令错误命令。

代码:

#get list of selected files from Graphical Dialog
listOfFilesSelected=$(zenity --file-selection --multiple --filename "${HOME}/")
#echo $listOfFilesSelected

# Here pipe is our delimiter value
IFS="|" read -a listFiles <<< $listOfFilesSelected

#echo "File: ${listFiles[@]}"
# get length of an array
#arraylength=${#listFiles[@]}

#echo "${listFiles[0]}"
##echo $'\n'
#echo "Number of elements in the array: ${#listFiles[@]}"


 for i in "${listFiles[@]}"
     do
         echo $i
         baseFileName = $(basename '$i')
         echo $baseFileName

         gs -dNOPAUSE -sDEVICE=jpeg -sOutputFile=output%d.jpg -dJPEGQ=100 -r600 -q $i -c quit
     done

输出:错误

/home/q/Downloads/FinalAnsKey22COMPUTER SCIENCE.pdf
./zentest.sh: line 20: baseFileName: command not found

Error: /undefinedfilename in (/home/q/Downloads/FinalAnsKey22COMPUTER)
Operand stack:

Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push
Dictionary stack:
   --dict:732/1123(ro)(G)--   --dict:0/20(G)--   --dict:75/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
GPL Ghostscript 9.50: Unrecoverable error, exit code 1

这是你的脚本的修复版本,仔细检查我修复了多个错误:

我建议您使用 https://shellcheck.net/

检查您的脚本

它是 shell 脚本的静态分析,将极大地帮助您发现错误,并且通常会列出一些选项来修复错误。

#!/usr/bin/env bash

#get list of selected files from Graphical Dialog
mapfile -t listFiles < <(
  zenity --separator=$'\n' --file-selection --multiple --filename="$HOME/"
)

for filePath in "${listFiles[@]}"; do
  printf '%s\n' "$filePath"
  baseFileName=${filePath##*/}
  printf '%s\n' "$baseFileName"

  # remove the echo if it does what you want
  echo gs -dNOPAUSE -sDEVICE=jpeg -sOutputFile=output%d.jpg -dJPEGQ=100 -r600 -q "$filePath" -c quit
done

正如其他人评论的那样,您需要对变量进行双引号,尤其是在 变量中的文件名包含空格。

你能试试吗:

#!/bin/bash

listOfFilesSelected=$(zenity --file-selection --multiple --filename "${HOME}/")

IFS="|" read -ra listFiles <<< "$listOfFilesSelected"

for i in "${listFiles[@]}"; do
    echo "$i"
    baseFileName=$(basename "$i")
    echo "$baseFileName"

    gs -dNOPAUSE -sDEVICE=jpeg -sOutputFile="$baseFileName"%d.jpg -dJPEGQ=100 -r600 -q "$i" -c quit
done