Shell 引用传递

转自知乎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之后本来是 1aevalptr1的值的a又可以作为变量被赋值了

附上运算结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值