在bash脚本中运行带参数的python命令时的变量表示法

在bash脚本中运行带参数的python命令时的变量表示法,python,linux,bash,shell,Python,Linux,Bash,Shell,我有一个bash脚本,它运行一堆python脚本,所有这些脚本都带有参数。为了有一个干净的代码,我想在脚本中使用变量 #/bin/bash 开始=0 SCRIPT_PATH=“/opt/scripts/” IP=“192.168.1.111” 如果[“$START”=“0”];然后 printf“%s:开始\n”“日期\时间” 端口=1234 TEST_FILE=“$SCRIPT_路径/TEST Scripts/TEST.TXT” SCRIPT=“$SCRIPT\u PATH/script1.p

我有一个bash脚本,它运行一堆python脚本,所有这些脚本都带有参数。为了有一个干净的代码,我想在脚本中使用变量

#/bin/bash
开始=0
SCRIPT_PATH=“/opt/scripts/”
IP=“192.168.1.111”
如果[“$START”=“0”];然后
printf“%s:开始\n”“日期\时间”
端口=1234
TEST_FILE=“$SCRIPT_路径/TEST Scripts/TEST.TXT”
SCRIPT=“$SCRIPT\u PATH/script1.py”
ARGS=“-P$SCRIPT_PATH/script2.py-n 15-P$PORT-i$IP”
python“$SCRIPT”${ARGS}-f“${TEST_FILE}”>。/out.log 2>&1&
fi
这段代码实际上正在工作,但有几件事我不明白:

  • 为什么,如果我在${ARGS}周围添加引号,python就无法正确解析参数?写这篇文章的最佳方式是什么
  • -f“${TEST\u FILE}”
    添加到
    ARGS
    变量的最佳方法是什么,而不使用python阻塞空白并抛出错误:
    “$SCRIPT\u PATH/TEST”找不到

  • 当您在参数列表周围加引号时,参数向量将收到一个包含所有用引号括起来的参数的单个参数,因此,参数解析器无法正确执行其工作,您就有问题了

    关于第二个问题,将引号嵌入数组并不容易,因为引号将在存储到数组中之前进行解析,然后在执行数组扩展以运行命令时,它们将丢失并失败。我已经试过几次了,但都没有成功

    另一种方法是,对脚本稍加修改,使用自定义内部字段分隔符(IFS)手动告知哪些应视为参数,哪些不应视为参数:

    #/bin/bash
    开始=0
    SCRIPT_PATH=“/opt/scripts/”
    IP=“192.168.1.111”
    如果[“$START”=“0”];然后
    printf“%s:开始\n”“日期\时间”
    端口=1234
    TEST_FILE=“$SCRIPT_路径/TEST Scripts/TEST.TXT”
    SCRIPT=“$SCRIPT\u PATH/script1.py”
    OLD_IFS=$IFS
    如果s=';'
    ARGS=“$SCRIPT;-P;$SCRIPT\u路径/script2.py;-n;15;-P;$PORT;-i;$IP;-f;$TEST\u文件”
    python${ARGS}>/out.log 2>&1&
    IFS=$OLD_IFS
    fi
    

    如您所见,我将ARGS中的空格替换为分号。这样,
    TEST_文件
    变量内容将被视为bash的单个参数,并在参数向量中正确填充。为了简单起见,我还将脚本移动到参数向量,否则,Python将无法获得正确的脚本路径并失败,这是由于我们对IFS所做的修改。

    我的想法是这样的(编辑了一些粗枝大叶,使其成为一个独立的示例):


    我懒得写一个答案,但是shell数组在这里可能会很有趣,它使用了
    “${foo[@]}”
    扩展语法。看。@TurePålsson我已经试过了,但没有成功。数组中引用的参数被解析得太早或太晚,我无法让它们在运行命令时被解析,而不是在进入数组或将引号泄漏到Python命令之前。@TurePålsson确实,我也尝试过,但像Marc一样失败了saying@RobertJones:引号由shell解释,请注意Python将变量
    ARGS
    作为单个参数接收。顺便说一句,您的
    ARGS
    不是数组。也许把它变成一个好主意。但是,由于您没有指定Python程序预期接收的参数,因此很难在这里给出建议。感谢您的回答,这是一个非常清楚的答案,而且这种方法比我预期的更复杂,但我完全掌握了预期的行为。
    #!/bin/bash
    SCRIPT_PATH="/opt/scripts/"
    IP="192.168.1.111"
    
    PORT=1234
    TEST_FILE="$SCRIPT_PATH/Test Scripts/test.TXT"
    SCRIPT="$SCRIPT_PATH/script1.py"
    set -a ARGS
    ARGS=(-P "$SCRIPT_PATH/script2.py" -n 15 -p "$PORT" -i "$IP")
    ARGS+=(-f "${TEST_FILE}")
    
    python3 -c "import sys; print(*enumerate(sys.argv), sep='\n')" "${ARGS[@]}"