我有一個 bash 腳本,它接受一個 getopt 引數,構建一個 Python getopt 選項并嘗試運行一個傳遞創建的 getopt 引數的 Python 腳本。但是,這不起作用。
我的 bash 腳本
#!/bin/bash
set -x
set -e
while getopts "d:" o; do
case "${o}" in
d)
echo $OPTARG
MY_DATETIME_PARAM="--my-date ${OPTARG}"
;;
esac
done
python my_python_script.py "${MY_DATETIME_PARAM}"
還有 my_python_script.py
import getopt
import sys
try:
opts, args = getopt.getopt(sys.argv[1:], "d:", ["my-date="])
except getopt.GetoptError as e:
print(e)
sys.exit(1)
for opt, arg in opts:
if opt in ("-d", "--my-date"):
print(arg)
結果是
$ ./test.sh -d 2012-12-12
set -e
getopts d: o
case "${o}" in
echo 2012-12-12
2012-12-12
MY_DATETIME_PARAM='--my-date 2012-12-12'
getopts d: o
python my_python_script.py '--my-date 2012-12-12'
option --my-date 2012-12-12 not recognized
但是,從 cmd 手動運行 python 腳本似乎作業得很好
$ python my_python_script.py --my-date 2012-12-12
2012-12-12
uj5u.com熱心網友回復:
問題是您${MY_DATETIME_PARAM}在呼叫 python 時參考,這使其成為單個字串和單個引數,而不是 2 個單獨的引數。
解決此問題的一種方法是洗掉最后一行中的引號:
python my_python_script.py ${MY_DATETIME_PARAM}
在這種情況下應該可以作業,但不是很健壯。更好的方法是將引數存盤在陣列中,然后在最后一行擴展陣列的元素,如下所示:
declare -a parameters
while getopts "d:" o; do
case "${o}" in
d)
echo $OPTARG
parameters =( "--my-date" "${OPTARG}" )
;;
esac
done
python my_python_script.py "${parameters[@]}"
然后,您可以通過添加到陣列來輕松添加引數。
重要的是要注意最后一行中的陣列擴展被參考。這可確保正確處理陣列元素中的空格。Shell 將引號解釋為:“參考陣列的每個元素”,而不是“參考展開后的所有元素”。例如:
> parameters=( "Hello" "Bon jour" "Auf wiedersehen, Pet" )
> echo ${parameters[@]}
Hello Bon jour Auf wiedersehen, Pet
> echo "${parameters[@]}"
"Hello" "Bon jour" "Auf wiedersehen, Pet"
盡管陣列只包含 3 個字串,但第一個回顯會產生 6 個不包含空格的單獨字串。第二個回聲給出了正確的結果。3 個字串,其中一些包含空格。
uj5u.com熱心網友回復:
您需要三個更改:
declare -a MY_DATETIME_PARAM
...
MY_DATETIME_PARAM=(--my-date "${OPTARG}")
...
python my_python_script.py "${MY_DATETIME_PARAM[@]}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/466162.html
上一篇:Bash腳本轉換為魚
