我的 python 脚本打印一个字符串print("declare -A gaps=( [2019-2-24]=4 )")
,我可以declare -A gaps=( [2019-2-24]=4 )
在 bash shell 上运行以创建一个名为gaps
.
在我的 bash 脚本中,我使用一个名为的变量gap_string
来访问 python 脚本的输出。然后我用反引号包围了gap_string
期望创建的字典,它失败了 got 和 error: 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脚本所做的就是把中国的农历改为日历,然后计算今天和具体的日历之间的天数,然后提醒我家人的生日。
使用反引号是错误的:这将尝试像外部命令一样执行字符串。但是该字符串是特定于bash的命令,并且已在当前 shell 的上下文中执行。有两种方法可以做到这一点:
eval
与命令替换一起使用source
与进程替换一起使用在这两种情况下,您最好确保您知道 python 脚本正在输出什么:您不想执行任何不受信任的代码。
您可以使用
set -x
命令进行调试。以下面的例子为例:会给你:
和
会给你:
所以你可以看到在第二种情况下正在执行的命令是: