私のPython scripyは文字列を印刷しますprint("declare -A gaps=( [2019-2-24]=4 )")
。これをdeclare -A gaps=( [2019-2-24]=4 )
bashシェルで実行してという辞書を作成できますgaps
。
私のbashスクリプトでは、python scripyという変数を使用してgap_string
scripyの出力にアクセスします。その後、期待値の周りにバックティックを使用して辞書を作成し、gap_string
エラーで失敗しましたdeclare: “[2019-2-24]=4”: is not a valid identifier
。
詳細は:
私のbashスクリプトのコード:
declare -A birthdays=(["${year}0120"]="GG")
gap_string=`/home/roach/.config/argos/LunarSolarConverter.py ${!birthdays[@]}`
if [ $? -eq 0 ]; then
`$gap_string`
fi
私のPythonスクリプトのコード:
if __name__ == '__main__':
converter = LunarSolarConverter()
gaps_string = ["declare -A gaps=("]
today = datetime.datetime.today()
today_date = today.date()
year = today.year
isleap = (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0))
days_this_year = 366 if isleap else 365
for i in range(1, len(sys.argv)):
year, month, day = int(sys.argv[i][:-4]), int(sys.argv[i][-4:-2]), int(sys.argv[i][-2:])
lunar = Lunar(year, month, day, isleap)
solar = converter.LunarToSolar(lunar)
gap = (datetime.date(solar.solarYear, solar.solarMonth, solar.solarDay) - today_date).days % days_this_year
if gap <= 4:
gaps_string.append(f"[{solar.solarYear}-{solar.solarMonth}-{solar.solarDay}]={gap}")
gaps_string.append(")")
if len(gaps_string) == 2:
sys.exit(1)
else:
print(" ".join(gaps_string))
sys.exit(0)
Pythonスクリプトが行うことは、旧暦日を揚力日に変換し、今日と特定の揚力カレンダーの間の日数を計算し、家族の誕生日を思い出させることです。
答え1
バックティックの使用はエラーです。これにより、外部コマンドのように文字列を実行しようとします。しかし、文字列は強く打つ現在、シェルのコンテキストで特定のコマンドが実行されました。これを行う方法は2つあります。
eval
そして使用コマンドの置き換えgaps=$( your_python_command ) eval "$gaps" # or, the variable is unnecessary: eval "$( your_python_command )"
source
そして使用プロセスの交換source <( your_python_command )
どちらの場合も、Pythonスクリプトが出力する内容を確認することをお勧めします。信頼できないコードを実行したくありません。
答え2
デバッグにはコマンドを使用できますset -x
。次の例を見てください。
set -x
declare -A gaps=( [2017-02-11]=4 )
あなたに与えるでしょう:
+ gaps=([2017-02-11]=4)
+ declare -A gaps
そして
s="declare -A gaps=( [2017-02-11]=4 )"
$s
あなたに与えるでしょう:
+ declare -A 'gaps=(' '[2017-02-11]=4' ')'
したがって、2番目のケースで実行されるコマンドは次のようになります。
declare -A 'gaps=('
declare -A [2017-02-11]=4
declare -A )