簡體   English   中英

在 bash 腳本中運行帶有參數的 python 命令時的變量符號

[英]Variable notation when running python commands with arguments in a bash script

我有一個 bash 腳本,它正在運行一堆帶有參數的 python 腳本。 為了有一個干凈的代碼,我想在腳本中使用變量

#!/bin/bash
START=0
SCRIPT_PATH="/opt/scripts/"
IP="192.168.1.111"

if [ "$START" = "0" ]; then
    printf "%s: Starting\n" "$DATE_TIME"

    PORT=1234
    TEST_FILE="$SCRIPT_PATH/Test Scripts/test.TXT"
    SCRIPT="$SCRIPT_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

這段代碼實際上有效,但我不明白的事情很少:

  1. 為什么,如果我在${ARGS}周圍添加引號,python 無法正確解析參數? 寫這個的最好方法是什么?
  2. -f "${TEST_FILE}"ARGS變量的最佳方法是什么,而不會在空格上阻塞 python 並拋出錯誤: "$SCRIPT_PATH/Test " not found

當您在參數列表周圍用引號括起來時,參數向量會收到一個參數,其中的所有內容都用引號括起來,因此,參數解析器無法正常工作,並且您遇到了問題。

關於你的第二個問題,把引號嵌入到數組中並不容易,因為引號在存入數組之前會被解析,然后當你執行數組擴展來運行命令時,它們會丟失並失敗。 我已經嘗試了幾次,但沒有成功。

另一種方法意味着您稍微修改腳本以使用自定義內部字段分隔符 (IFS) 來手動判斷哪些應該被視為參數,哪些不是:

#!/bin/bash
START=0
SCRIPT_PATH="/opt/scripts/"
IP="192.168.1.111"

if [ "$START" = "0" ]; then
    printf "%s: Starting\n" "$DATE_TIME"

    PORT=1234
    TEST_FILE="$SCRIPT_PATH/Test Scripts/test.TXT"
    SCRIPT="$SCRIPT_PATH/script1.py"
    OLD_IFS=$IFS
    IFS=';'
    ARGS="$SCRIPT;-P;$SCRIPT_PATH/script2.py;-n;15;-p;$PORT;-i;$IP;-f;$TEST_FILE"
    python ${ARGS} > ./out.log 2>&1 &
    IFS=$OLD_IFS
fi

如您所見,我用分號替換了 ARGS 中的空格。 這樣, TEST_FILE變量內容將被視為 bash 的單個參數,並將正確填充到參數向量中。 為簡單起見,我還將腳本移至參數向量,否則,由於我們對 IFS 進行了此修改,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[@]}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM