我正在尝试编写一个脚本zsh
,我需要使用数组才能以优雅的方式实现我的目标。在网上阅读了一些信息后,我尝试通过以下方式实现和访问数组的元素:
### Script for running everything in screens ###
killall -15 screen ## We make sure that no screens are running for now
#bkgarr=(TopJets BosonJets DiBoson TTbar)
bkgarr=(1 2 3)
screen -dmS "MYSCREEN"
screen -S "MYSCREEN" -p 0 -X stuff 'echo "The array has ${#bkgarr[*]} of elements."^M'
screen -S "MYSCREEN" -p 0 -X stuff 'echo ${#bkgarr[0]}^M'
但是,这不起作用,我得到的输出如下:
~/Summer_Students/nTupler_topness/tupleAnalyzer% echo "The array has ${#bkgarr[*]} of elements."
The array has 0 of elements.
~/Summer_Students/nTupler_topness/tupleAnalyzer% echo ${#bkgarr[0]}
0
此外,我需要一个字符串数组,就像这个最小工作示例中注释掉的字符串一样。如果有人能指出我的错误以及为什么数组显然没有存储在计算机内存中,我会很高兴。
代码编辑:
### Script for running everything in screens ###
killall -15 screen ## We make sure that no screens are running for now
#bkgarr=(TopJets BosonJets DiBoson TTbar)
bkgarr=(1 2 3)
screen -dmS "MYSCREEN"
screen -S "MYSCREEN" -p 0 -X stuff "$(typeset -p bkgarr)"$'\r'
#screen -S "MYSCREEN" -p 0 -X stuff 'bkgarr=(1 2 3)^M'
screen -S "MYSCREEN" -p 0 -X stuff 'echo "The array has ${#bkgarr[*]} of elements."^M'
screen -S "MYSCREEN" -p 0 -X stuff 'echo ${#bkgarr[0]}^M'
之后输出:
~/Summer_Students/nTupler_topness/tupleAnalyzer% declare -a bkgarr='([0]="1" [1]="2" [2]="3")'
declare: bkgarr: can't assign initial value for array
~/Summer_Students/nTupler_topness/tupleAnalyzer% echo "The array has ${#bkgarr[*]} of elements."
The array has 0 of elements.
~/Summer_Students/nTupler_topness/tupleAnalyzer% echo ${#bkgarr[0]}
0
~/Summer_Students/nTupler_topness/tupleAnalyzer%
提前致谢
答案1
该数组是在解释脚本的 shell 中定义的,而不是在屏幕终端窗口中运行的数组。
要将其传递到屏幕窗口zsh
,请尝试:
screen -S "MYSCREEN" -p 0 -X stuff "$(typeset -p bkgarr)"$'\r'
请注意,它会将换行符作为换行符发送,而不是作为回车符。不过,这应该没问题zsh
(只是换行符将被插入到命令行中,并且不会导致接受该行(这也很好))。
如果您的数组包含^C
, "
,\e
字符或其他终端特有的字符 或zle
,screen's
stuff
那么这将不起作用。如果您的 shell 尚未准备好接收该输入,则相同。
您可能想要找到另一种方法将信息传递到窗口内运行的 shell,例如通过作为挂钩的一部分进行检查的 fifo 文件precmd
。