脚本中的“指针”

原创 2012年03月31日 02:22:15

在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关键词可以实现类似指针的效果——使用变量的变量。

C和指针代码及答案

  • 2017年11月29日 20:50
  • 566KB
  • 下载

没有躲过的坑--vector使用erase后迭代器变成野指针

vector上镜率非常高,但是最近又被他fuck了一下。使用的就是vector的erase方法。erase–return value 首先需要明确一下vector的两种erase:C++98中是这...

嵌入式实习-day3-指针与函数

  • 2017年11月20日 10:37
  • 517KB
  • 下载

指针学习笔记

  • 2017年11月26日 14:37
  • 61KB
  • 下载

【Leetcode】3Sum - 【两个指针】

15. 3Sum Total Accepted: 127471Total Submissions: 659843Difficulty: Medium Given an array S...

C和指针书籍+课后答案源代码

  • 2017年11月27日 16:41
  • 27.51MB
  • 下载

C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟

一、对象数组的定义和初始化 1. 对象数组的创建方法:   //常量都是无名对象 1)类类型 数组名[元素个数]; 2)类类型 数组名[元素个数] = { 数组的初始化列表... }; 2. ...

编程语言系列:C和指针

  • 2017年11月25日 19:13
  • 15.71MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:脚本中的“指针”
举报原因:
原因补充:

(最多只允许输入30个字)