转自知乎https://zhuanlan.zhihu.com/p/38015305
===================================================
在交换变量问题中,我们都知道值参数传递不能实现交换
void swap1(int a,int b)//值传递 ❌
{
int temp;
temp = a;
a = b;
b = temp;
}
解决方案是使用引用传递或指针传递
void swap2(int &a,int &b)//引用传递
{
int temp;
temp = a;
a = b;
b = temp;
}
void swap3(int *a,int *b)//指针传递
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
但在今天写shell脚本的过程中我也遇到了这样的需求,废话不说,代码敬上
#!/bin/sh
a=123
b=456
swap()
{
eval value1=\$$1
ptr1=$1
eval value2=\$$2
ptr2=$2
eval $ptr1=$value2
eval $ptr2=$value1
}
echo a is $a #123
echo b is $b #456
eval swap a b
echo Now a is $a #456
echo Now b is $b #123
学javascript的小伙伴应该很熟悉这个eval,没错shell中也有,而且从一定意义上两者还有着异曲同工之妙
$1的值其实是a,$1便可以理解为1便可以理解为1便可以理解为a,加上eval之后就把$a的值拿出来了
$ptr1的值是从1赋值来的,所以也是a,加上eval之后本来是1赋值来的,所以也是a,加上eval之后本来是1赋值来的,所以也是a,加上eval之后本来是ptr1的值的a又可以作为变量被赋值了
附上运算结果:

微信扫码关注:挑灯看剑王知事

博客讲述在shell脚本编写中遇到变量交换需求,指出值参数传递无法实现交换,可采用引用传递或指针传递。还提到shell中的eval与JavaScript的eval有相似之处,通过eval可对变量进行赋值等操作,并附上运算结果。
1040

被折叠的 条评论
为什么被折叠?



