【问题标题】:Linux script to run another command which requires double quotes运行另一个需要双引号的命令的 Linux 脚本
【发布时间】:2023-03-29 01:01:01
【问题描述】:

我正在做一场噩梦,试图让它正确运行。我使用 php 代码做得很好,但问题是命令超时的文件很多。我以为我可以通过盒子本身上的 ssh 轻松做到这一点,但我无法让它做我想做的事。

在 PHP 中我正在执行以下操作:

$command='/usr/bin/convert "'. $LocalPDFURL . '[1]" -quality 70% "' . $LocalJPGURL . '"' ; 

我需要搜索 pdf 文件,如果没有使用 pdf 的第一页生成 jpg,请检查它们是否有具有相同文件名的 .jpg。以上在 php.ini 中运行良好。但是在 linux shell 脚本中,无论我尝试了什么,它都不会起作用。我尝试了各种组合,它要么将整个内容输出为字符串,要么输出错误,因为它没有传递指定完整文件路径所需的双引号(它们包含空格)。

我的脚本是这样的:

format=*.pdf
wpath=$format
for i in $wpath;
do
 if [[ "$i" == "$format" ]]
 then
    echo "No PDF Files to process!"
 else
    echo "full file name: $i"
    FILE="${i%.pdf}.jpg"
    if [ -f "$FILE" ]; then
        echo "$FILE exists."
    else 
        ORIGINAL=\""${FILE%.jpg}.pdf\""
        QFILE=\""$FILE%\""
        echo "$FILE does not exist. Creating PDF Cover JPG!"
        command="/usr/bin/convert "\""$ORIGINAL"\" 1 -quality 65% $QFILE 2>&1"
        echo $command
    fi

 fi
done

我只想构建命令并执行它。

php 命令输出如下所示...

"/usr/bin/convert "/home/test/1.pdf" 1 -quality 65% "/home/test/1.jpg" 2>&1"

运行良好。

我试过单引号,双引号转义等等。请有人帮忙!

【问题讨论】:

    标签: php linux command quotes


    【解决方案1】:

    所以我的建议如下:

    1. 在 bash 中创建一个函数来执行您想要的操作(即:给定一个 pdf 文件,检查相应的 jpg 文件是否存在,如果不存在则转换它)
    2. 将该功能应用于您的所有 pdf 文件
    maybe_convert(){
      ! [ -f "${1%.*}.jpg" ] && echo "/usr/bin/convert \"$1\" 1 -quality 65% \"${1%.*}.jpg\"" || echo $1 exists
    }
    export -f maybe_convert
    find . -type f -name "*.pdf" | xargs -I{} bash -c "maybe_convert \"{}\""
    

    上面的 sn-p 适用于以下文件结构(假设您已将 sn-p 保存在名为 convert_image.sh 的文件中):

    $ ls testdir/
    'file 1.jpg'  'file 1.pdf'  'file 2.pdf'  'file 3.pdf'
    $ bash convert_image.sh
    /usr/bin/convert "./testdir/file 3.pdf" 1 -quality 65% "./testdir/file 3.jpg"
    /usr/bin/convert "./testdir/file 2.pdf" 1 -quality 65% "./testdir/file 2.jpg"
    ./testdir/file 1.pdf exists
    

    【讨论】:

    • 谢谢。目前使用上面的脚本,我得到了所有文件。我可以在脚本中创建函数,但是如何使用我正在使用的包含完整 pdf 文件名的 $ORIGINAL 变量来调用它?我试过使用你的代码,但我无法让它工作。我也试过单独使用你的代码,它只是说“没有这样的文件或目录”。
    • 我已设法添加该函数并正确调用它。但是,双引号在函数内部不起作用。文件名中有空格,因此转换程序的输出需要用双引号括起来。它现在正在输出命令,但它在文件名的第一个空格处截断它。即“我的文件名 1”被输出为“我的”。我试图在我的 $QFILE 中将文件名用双引号括起来,不幸的是,这些都不起作用。
    • 尝试在最后一行的花括号周围加上引号(就像我更新了答案一样)
    • 不,它仍然不起作用。输入文件名在第一个空格处被截断。 “我的文件名1”仍然输出为“我的”。
    • 您是否还在第一次出现的文件名变量周围添加了引号(即在[ -f "${1%.*}.jpg" ] 中)?我之前的评论忘记提到了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2011-03-26
    • 2015-10-03
    • 2011-09-28
    • 2014-03-08
    相关资源
    最近更新 更多