在交换变量问题中,我们都知道值参数传递不能实现交换
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便可以理解为$a,加上eval之后就把$a的值拿出来了
$ptr1的值是从$1赋值来的,所以也是a,加上eval之后本来是$ptr1的值的a又可以作为变量被赋值了