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 的转换。
问题
- 需要存储在带有转义空格的数组中的文件路径才能进入 gs 命令 $i
- 在 for 循环内的 gs 命令中需要输出文件名的基本文件名
- gs 命令需要带转义空格的文件名。
- 无法运行第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
这个bashshell脚本 使用 zenity 获取多个 .pdf 文件输入并存储在数组中以进行 ghostscript .pdf 到 .jpeg 的转换。
问题
- 需要存储在带有转义空格的数组中的文件路径才能进入 gs 命令 $i
- 在 for 循环内的 gs 命令中需要输出文件名的基本文件名
- gs 命令需要带转义空格的文件名。
- 无法运行第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