我在一堆帐户上运行 offlineimap,并希望检查每次运行的退出代码并相应地执行一些操作。
我有 6 个独立的电子邮件帐户,我使用大量重复代码运行这些帐户。原来的命令结构是:
$ $(which offlineimap) -c offlineimaprc -o -a yahoo & declare yahoo_pid=$!
wait $yahoo_pid
yahoo_st=$?
if [[ $yahoo_st -ne 0 ]];then <do some stuff>
$ $(which offlineimap) -c offlineimaprc -o -a gmail & declare gmail_pid=$!
wait $gmail_pid
gmail_st=$?
if [[ $gmail_st -ne 0 ]];then <do some stuff>
现在我想删除重复项并从for in
循环和wait
命令中运行它。${account-name}_pid(例如 yahoo_pid)替换工作正常,但我被命令卡住了wait
。
$ for app in yahoo gmail
do
$(which offlineimap) -c offlineimaprc -o -a ${app} & declare ${app/%/_pid}=$!
wait ${app}_pid
done
[1] 73443
-bash: wait: `$yahoo_pid': not a pid or valid job spec
[2] 73444
-bash: wait: `$gmail_pid': not a pid or valid job spec
上面的这个看起来很奇怪。While
app
是一个数组,只需引用$app
就会从数组中获取第一个元素,与${arr[0]}
. 所以那总是分配给yahoo_pid
.这根本行不通。在等号左侧有一个扩展使其成为无效分配,shell 会将其作为命令处理。如果
$yahoo_st
未设置,并且$?
例如是0
,它将尝试运行一个名为=0
.无论如何,就你的情况而言。
Bash 有关联数组,即由字符串索引的数组,它们几乎就是您在这里所需要的。它们需要用 声明
declare -A
,可以像上面那样分配常规数组。或者可能:
或者,您可以使用 namerefs 来引用在另一个中命名的变量。这将设置
pid_yahoo
和st_yahoo
:但实际上只是使用关联数组。
参见例如
从问题转移到答案
一分钱花了很多搜索和示例才最终落到这一点上,但这最终对我有用: