在bash脚本中运行带参数的python命令时的变量表示法
我有一个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
#/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
这段代码实际上正在工作,但有几件事我不明白:
-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[@]}"