脚本中的“指针”

在C/C++语言中常常会使用到指针,我很难想象,如果C/C++中没有指针,能做什么。

前两天写一个自动化打包的脚本,发现脚本中也可以实现近似的功能——那就是变量中的变量。

最开始想到这个问题,是因为这个自动化打包的脚本,需要打多个不同平台类型的包。而这些不同类型的包打包过程中有很多相似的操作,比如:将文件进行编译、将文件安装到不同的目录、将文件从一个目录拷贝到另一个目录。

举个例子,有A、B两种平台下的程序,分别在AA和BB目录,而打包之前需要将其分别拷贝到安装目录unpkg_AA、unpkg_BB。当然两种平台的可以直接写两个拷贝操作。但是这样就增加了代码冗余度,最重要的是不利于扩展。那么自然会将公共的拷贝操作提取出copy_file来,将AA或者BB作为参数,从而就可以降低代码冗余,提高代码复用率,最重要的是更易扩展了。但是事实通常不那么理想:可能这些拷贝的操作通常并不是从AA拷贝到unpkg_AA。有可能你需要从AX拷贝到unpkg_AC,从YY拷贝到unpkg_BB。这样你可能就需要一层封装——将这些源、目的地址对封装成对应的模式,如:令变量AA=AX,INSTALL_AA=unpkg_AC;BB=YY,INSTALL_BB=unpkg_BB。如此一来你就可以传入AA或者BB,实现文件的拷贝了。但是此时还有一点:这是在脚本中。对,脚本中,我传进去的是字符串AA,而最终要拷贝的源是AX,即变量$AA的值,而要得到"AA"这个变量的名字(字符串),并且可能你通常是通过$1,$2,$n...之类的变量获取到其值(如果直接使用变量AA的话,相当于是使用了全局变量了——这不是什么好事儿吧!?)。即此时我们需要从变量$1(暂且就认为是只有一个参数没问题吧)获得变量名称AA,然后再取出变量AA的值AX,根据命名模式得到目标地址的变量名INSTALL_AA(可能这样命名不一定是好事),再取出INSTALL_AA的值unpkg_AC,进行我们的拷贝操作了。那么这里有一个关键的问题了,我们需要访问一个变量的变量。呵呵,感觉有点拗口。那我们得借助一个关键词eval。

比如  eval SRC=\${$1},就会首先对$1取值,得到AA,然后再对$AA取值,得到AX,将其赋给SRC。

应该明白了吧,还不清楚,再看看下面的代码你就明白啦!
AA="AX";
INSTALL_AA="unpkg_AC";
BB="YY";
INSTALL_BB="unpkg_BB";
function copy_file()
{
	eval SRC=\${$1};
	eval DST=\${INSTALL_$1};
	cp -rf ${SRC} ${DST};
}
function copy_all_files()
{
	for dir_iter in "AA" "BB"
	do
		copy_file ${dir_iter};
	done
}
function main()
{
	copy_all_files;
}
总结:shell脚本中使用eval关键词可以实现类似指针的效果——使用变量的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值