代码之家  ›  专栏  ›  技术社区  ›  jjclarkson Andy Rose

bash和php,引用命令行参数

  •  2
  • jjclarkson Andy Rose  · 技术社区  · 17 年前

    我有一个使用bash脚本转换PDF的PHP程序。但是,如果文件名包含空格,则不会正确地通过bash脚本传递。

    如何在bash脚本中转义带有空格的文件名?您是否需要做一些特殊的事情来引用“outfile”变量的文件名?

    BASH脚本:

    #!/bin/bash
    
    INFILE=$1
    OUTFILE=${INFILE%.*}
    
    gs \
    -q \
    -dSAFER \
    -dBATCH \
    -dNOPAUSE \
    -sDEVICE=png256 \
    -r150x150 \
    -sOutputFile=${OUTFILE}.png \
    ${INFILE}
    

    PHP脚本:

    echo "converting: ".$spool.$file . "\n";
    system("/home/user/bin/pdf2png.sh " . escapeshellarg($spool . $file));
    

    编辑: 我删除了escapeShellArg()变量的引号。但这并没有解决问题。我认为它在bash脚本的outfile变量中。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Dennis Williamson    17 年前

    在shell脚本的最后一行中,在变量引用周围加引号:

    "${INFILE}"
    
        2
  •  2
  •   Pascal MARTIN    17 年前

    考虑到您的代码,我首先尝试删除您在参数周围插入的单引号:这些不应该是必需的,因为您正在使用 escapeshellarg .

    例如, temp.php 文件可能包含:

    $spool = "ab cd/";
    $file = "gh ij";
    system("sh ./test.sh " . escapeshellarg($spool . $file) . "");
    

    以及 test.sh :

    #!/bin/bash
    INFILE=$1
    echo $1
    

    有了这些,输出是:

    $ php temp.php
    ab cd/gh ij
    

    看起来像你所期望的。


    如果我把单引号放回去,就像这样:

    system("sh ./test.sh '" . escapeshellarg($spool . $file) . "'");
    

    输出再次中断:

    $ php temp.php
    ab
    

    逃亡者 正在为您转义数据 (根据操作系统的不同,使用正确的引号和所有这些选项) 你不必自己去做。

        3
  •  0
  •   user170261    17 年前

    要用空格转义文件名,只需使用。

    My Tar Ball.tar
    
    My\ Tar\ Ball.tar
    

    因此,对于您拥有的内容,您要么需要确保在调用脚本时参数包含反斜杠,要么需要添加一些输入检查。

        4
  •  0
  •   VolkerK    17 年前