Pythonスクリプトの出力からシェル辞書を作成するには?

Pythonスクリプトの出力からシェル辞書を作成するには?

私のPython scripyは文字列を印刷しますprint("declare -A gaps=( [2019-2-24]=4 )")。これをdeclare -A gaps=( [2019-2-24]=4 )bashシェルで実行してという辞書を作成できますgaps

私のbashスクリプトでは、python scripyという変数を使用してgap_stringscripyの出力にアクセスします。その後、期待値の周りにバックティックを使用して辞書を作成し、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つあります。

  1. evalそして使用コマンドの置き換え

    gaps=$( your_python_command )
    eval "$gaps"
    # or, the variable is unnecessary:
    eval "$( your_python_command )"
    
  2. 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 )

関連情報