转自知乎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 , 加 上 e v a l 之 后 本 来 是 1赋值来的,所以也是a,加上eval之后本来是 1赋值来的,所以也是a,加上eval之后本来是ptr1的值的a又可以作为变量被赋值了
附上运算结果: