最近需要编写一个脚本来处理数据,编写过程中遇到了两个难题:
(1)有一个列表[ X Y Z]和一组变量 A_0, A_1, A_2。我要实现一个循环如下:
在第一次循环中,输出 X Y Z和A_0 A_1 A_2;
在第二次循环中,输出 Y Z X和A_2 A_0 A_1;
在第二次循环中,输出 Z X Y和A_1 A_2 A_0;
也就是在每一个循环中同时分别实现列表[ X Y Z ]和 [ A_0, A_1, A_2 ]的左移和右移
(2)嵌套变量替换问题
经过一段时间的网上各种资料的查找加上自己的经验最终解决了以上问题,在此总结如下,希望和广大热心网友和各位大佬一起探讨,更期待各位大佬的批评指正。
首先,实现列表左移
通过以上脚本容易得到列表左移,输出结果如下:
而列表右移则加入如下代码(红色方框为新加代码):
运行后输出结果如下(三个红色方框分别为三次循环输出):
可以看到代码实现了我想要的结果,然而个人感觉实现列表右移的代码太过复杂,凭直觉应该有更简单优雅的代码,期待各位网友能够给出。
在实现列表右移的过程中遇到了嵌套变量替换的问题,就顺便解决了一下这个问题。
用${B_$A}替换变量会导致错误,此处原因我还没搞懂,希望网友给出
使用eval赋值语句之后可以看到,嵌套变量替换成功。原因:eval会把赋值语句中双引号之间的内容直接赋给‘=’前的变量,而不是当作字符串赋给变量,当在一个赋值语句的前面加上 eval 时,它就会将 后面表达式中以 $ 开头的所有变量进行整体替换。此处执行过程为将$A替换为A的值1,从而test就变成了$B_1,加上前面解释的eval的作用,$B_1会被替换为B_1的值3,因此,test的最终值就是3。
关于eval实现嵌套变量的方法参考shell中eval命令妙用——变量嵌套替换 - AhaoMu - 博客园
继续测试发现,如方框1所示,将$符号和变量的几个字符连续写到一个双引号中并不能替换变量得到B_1的值而只输出了A的值;而将$符号单独写到一个双引号中(如方框2所示),再将变量的几个字符连续写到一个双引号中能够得到正确结果
继续测试,这样s相当于${B_1},${B_1}的效果比$B_1的效果更好,因为前者可以明确体现出变量的开始和结束界限,然后再进行变量替换得到了同样的结果。
以上就是最近的一点经验总结,分享出来和大家一起探讨,希望得到大家的批评指正,上文中提到的两个问题(其一是列表右移的更优雅代码,其二就是${B_$A}变量替换导致错误的原因)也期待万能网友予以解决,如果能给出一定的参考书籍就更nice了。