linux脚本难题,shell脚本踩过的坑

首先shell脚本不允许在写表达式的时候加空格

比如:

a=1 正确语法

a = 1 错误语法

if语句块 坑

if 和条件语句块之间必须要有空格,[] 里面两端也必须要有空格

如果if语句写在同一行要加; 为了防止错误建议还是不要写一行

else 里面不允许出现空代码块,如果没有逻辑就不要写else

比如:

a=10

b=20

if [ ${a} -eq ${b} ]

then

echo "相等"

else

echo "不等"

fi

格式不要和上面的写法不一样,否则出错给你看

数字的比较要用数字运算符 -eq -ne -gt -lt -ge -le

字符的比较要用字符比较符 = != -z -n

运算符参考文章 点击

shell 函数返回值坑

return 的问题

shell 函数使用return语句只能返回整数,且还不能超出 0~255 这个范围,溢出会返回0值,这个一定要注意很大的坑

而且使用return返回的值 只有使用$?才能拿到,一般使用return 做函数的执行成功与否

怎么才能拿到想要的返回值

那怎么返回我们想要的值呢? 方法就是使用echo,shell 会把echo输出的值返回到调用函数的地方,这个相当于是其他高级语言的return,不过这个echo不会终止函数而已,shell 会把所有的echo 都返回到调用的地方,所以你要仔细确定你返回了多少个echo

注意:这里echo的坑

shell函数将echo的数据返回到调用的地方,如果调用函数的地方有变量接收,则数据赋值给变量,不会打印到终端,

如果没有变量接收,则shell会将数据输出到终端

下面是对echo的代码示范

1 # /bin/bash

2

3 a=1

4 fund(){

5 echo $a

6 a=2

7 echo $a

8 }

9

10 fund

11 echo $a

上面的这个脚本运行之后是 # 如果没有变量接收,数据按照echo格式默认输出

1

2

2

如果改成下面这样

1 # /bin/bash

2

3 a=1

4 fund(){

5 echo $a

6 a=2

7 echo $a

8 }

9

10 res=`fund`

11 echo $a

输出结果是

1

没错答案就是1,函数内部的输出被赋值给了res,而不会输出到终端,至于为什么变量a还是1而不是2 下面是原因:

调用函数或者执行shell命令放在句首时不需要使用``或$()的,因为shell认识,但如果放在赋值表达式右边的话shell就不认识了,

至于答案为什么是1不是2,是因为

调用了``相当于开了一个子shell去运行程序,然后将结果返回,子shell是可以访问父shell的变量

但是子shell生成的变量以及所作的修改不影响父shell,还有shell中默认都是全局变量,无论是写在函数内还是函数外.如果想要让变量变成局部变量需要使用local

下面是对res 的打印

1 # /bin/bash

2

3 a=1

4 fund(){

5 echo $a

6 a=2

7 echo $a

8 }

9

10 res=`fund`

11 echo $res

12 echo ${res[0]}

13 echo ${res[1]}

14 echo $a

打印结果是

1 2

1 2

# 注意这是个空行

1

从上面看出返回的结果组合成了一个字符串,如果你想要所有的返回结果组成一个元祖

将上面的res=`fund` 修改为 res=(`fund`) 就可以了

怎么返回数组呢

如果你想返回数组,不好意思,不支持,不过还是通过其他渠道返回的

方式一: 使用echo

使用这种方式的弊端是如果你想在函数内部打印内容到终端,且还需要用变量接收就会很麻烦,只能够先返回结果,然后接收最后在打印

在shell 函数中,echo输出的值 和return输出的值返回给调用函数的地方

ok,我们就可以利用这个特性,将数组在函数内部拆分位为一个个元素,然后使用echo一个一个的返回元素,为什么要一个一个,因为echo也不支持返回数组,如果你返回了数组,它只会返回数组的第一个元素.所以我们一个一个的返回数据,然后在函数调用的地方重新组合

1 # /bin/bash

2

3 fun1(){

4 a=(1 2 3)

5 echo ${a[*]}

6 }

7

8 fun(){

9 b=(`fun1`) # 这里加括号是为了组合数组

10 echo ${b[*]}

11 }

12

13 res=(`fun`)

14 echo ${res[*]}

返回数组的方式二:使用全局变量的方式

1 a=(4 5)

2 fun(){

3 a=(1 2 3)

4

5 }

6 b=(`echo ${a[*]}`)

7 fun -- 注意fun 一定不能放在等式的右边,比如 res=`fun` ,如果这样做就拿不到下面的输出了

8 c=(`echo ${a[*]}`)

9 echo ${b[*]}

10 echo ${c[*]}

输出结果:

4 5

1 2 3

缺陷:使用这种方式只能直接调用函数或者linux命令,不能够``或者$()这样方式调用,涉及作用域问题,下面有讲解

在shell中默认都是全局变量,所以你可以在函数内部将数组赋值给全局变量,这样就能在调用函数之后拿到数组

不过一定要注意,不能带有`` 或者$()

1 a=(4 5)

2 fun(){

3 a=(1 2 3)

4

5 }

6 b=(`echo ${a[*]}`)

7 res=`fun` -- 一旦加了`` 或者 $() 就不能拿到更改后的数组了,所以请使用上面的方式

8 c=(`echo ${a[*]}`)

9 echo ${b[*]}

10 echo ${c[*]}

输出结果:

4 5

4 5

shell 调用能够直接在linux终端调用的命令

能够在linux终端运行的命令在shell脚本中也能够运行

如果命令放在句首不需要加`` 或者 $()

如果命令放在赋值运算符的右边将命令执行的结果赋值给变量,这个时候命令就需要加``和$()

调用shell自己定义的函数是一样的道理,如果放句首不需要`` or $() 如果放赋值运算符右边就需要加`` or $()

注意:

调用了``相当于开了一个子shell去运行程序,然后将结果返回,子shell是可以访问父shell的变量

但是子shell生成的变量以及所作的修改不影响父shell,还有shell中默认都是全局变量,无论是写在函数内还是函数外.如果想要让变量变成局部变量需要使用local

``和$()的作用域问题

`` 和 $() 是开了子shell去运行命令,然后将命令运行的结果回传,但是子shell所作的操作不会更改父shell变量数据,这里要注意一下,还有父shell不能使用除子shell返回之外的数据,但是子shell可以使用父shell的变量.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值