Linux教程

Linux中Shell编程入门汇总

本文主要是介绍Linux中Shell编程入门汇总,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

    • 一、Shell 脚本
    • 二、Shell 变量
      • 2.1、定义变量
      • 2.2、使用变量
      • 2.3、只读变量
      • 2.4、删除变量
    • 三、Shell 字符串
      • 3.1、单引号
      • 3.2、双引号
      • 3.3、拼接字符串(双引号)
      • 3.4、拼接字符串(单引号)
      • 3.5、获取字符串长度
      • 3.6、提取子字符串
      • 3.7、查找子字符串
    • 四、Shell 数组
      • 4.1、数组定义及取值
      • 4.2、获取数组的长度
    • 五、Shell 注释
      • 5.1、单行注释
      • 5.2、多行注释
    • 六、Shell 运算符
      • 6.1、算术运算符
      • 6.2、关系运算符
      • 6.3、布尔运算符
      • 6.4、逻辑运算符
      • 6.5、字符串运算符
      • 6.6、文件测试运算符
    • 七、Shell echo 命令
      • 7.1、显示字符串
      • 7.2、换行与不换行
      • 7.3、显示结果定向至文件
      • 7.4、显示命令执行结果
    • 八、Shell printf 命令
    • 九、Shell test 命令
      • 9.1、数字测试
      • 9.2、字符串测试
      • 9.3、文件测试
    • 十、Shell 流程控制
      • 10.1、if
      • 10.2、if else
      • 10.3、if else-if else
      • 10.4、for 循环
      • 10.5、while循环
      • 10.6、无限循环
      • 10.7、case ... esac
      • 10.8、break
      • 10.9、continue
    • 十一、Shell 传递参数
      • 11.1、基本用法
      • 11.2、其他参数说明
    • 十二、函数
      • 12.1、简单使用
      • 12.2、获得函数的返回值
      • 12.3、函数赋值说明
    • 结语

一、Shell 脚本

  使用#!/bin/bash或者 #!/bin/sh 定义

#!/bin/bash
echo "Alian love java"

二、Shell 变量

  • 命名只能使用英文字母数字下划线首个字符不能以数字开头
  • 变量名和等号中间不能有空格,可以使用下划线(_
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

2.1、定义变量

  以下是合法的变量定义

#!/bin/bash

projectName="pay"
project_name="query"
_project_name="notice"

2.2、使用变量

  使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:

#!/bin/bash

projectName="pay"
echo $projectName
echo ${projectName}

两种方式都可以,不过第二种方式在字符串拼接变量时用得多,且不会报错

2.3、只读变量

  加上readonly 的变量为只读变量,不能更改值

#!/bin/bash

readonly systemName="Linux"
systemName="ubuntu"

则会提示:systemName: 只读变量

2.4、删除变量

  使用 unset 命令可以删除变量

#!/bin/bash

tempStr="abcdef"
unset tempStr
echo $tempStr

  则此时变量结果就为空了

三、Shell 字符串

3.1、单引号

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
#!/bin/bash

str='this is a simple string'
echo $str

3.2、双引号

  • 双引号里可以有变量
  • 双引号里可以出现转义字符
#!/bin/bash

operating_system="linux"
str="Hello, operating system is \"$system_name\"! \n"
echo -e $str

3.3、拼接字符串(双引号)

  双引号里可以有变量,双引号里也可以出现转义字符

#!/bin/bash

username="alian"
greeting="Hello $username"
echo $greeting

运行结果:

Hello alian

3.4、拼接字符串(单引号)

  单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的

#!/bin/bash

username='alian'
greeting='Hello $username'
echo $greeting

运行结果:

Hello $username

3.5、获取字符串长度

#!/bin/bash

tempstr="abcd"
echo "字符串的长度:${#tempstr}"

运行结果:

字符串的长度:4

3.6、提取子字符串

下标是从0开始

#!/bin/bash

string="Alian is learning java"
echo ${string:1:5}
string="runoob is a great site"
echo `expr index "$string" io`

运行结果:

lian

3.7、查找子字符串

  查找字符 i 或 o 的位置(位置从1开始,哪个字母先出现就计算哪个)

#!/bin/bash

string="Alian is learning java"
echo `expr index "$string" ia`

运行结果:

3

四、Shell 数组

4.1、数组定义及取值

  用括号来表示数组,数组元素用"空格符号"分割开,如下:

  数组名=(值1 值2 … 值n)

#!/bin/bash

fruits=("Apple" "Banana" "Orange" "kiwifruit")
#按下标取值从0开始
echo ${fruits[2]}
# 使用 @ 符号或者 * 符号可以获取数组中的所有元素,例如:
echo ${fruits[@]}
echo ${fruits[*]}

运行结果:

Orange
Apple Banana Orange kiwifruit
Apple Banana Orange kiwifruit

4.2、获取数组的长度

  获取数组长度的方法与获取字符串长度的方法类似

  ${#数组名[*]} 或者 ${#数组名[@]}

#!/bin/bash

fruits=("Apple" "Banana" "Orange" "kiwifruit")
#获取数组长度的两个方式
echo "方式一,数组的长度:${#fruits[*]}"
echo "方式二,数组的长度:${#fruits[@]}"

运行结果:

方式一,数组的长度:4
方式二,数组的长度:4

五、Shell 注释

5.1、单行注释

  以 # 开头的行就是注释,会被解释器忽略。

#!/bin/bash

#alian正在总结Shell编程的基础知识
#如果有什么疑问,可以通过博客联系我
#博客地址:https://blog.csdn.net/Alian_1223

echo "I'll be waiting for you"

运行结果:

I'll be waiting for you

5.2、多行注释

  当然可以通过每一行加一个 # 号设置多行注释,这里我们要说的其他的方式

#!/bin/bash
echo "eof格式的注释内容"
:<<EOF
eof格式注释内容
eof格式注释内容
eof格式注释内容
EOF

echo "感叹号格式注释内容"
:<<!
感叹号格式注释内容
感叹号格式注释内容
感叹号格式注释内容
!

echo "单引号格式的注释内容"
: '
单引号格式注释内容
单引号格式注释内容
单引号格式注释内容
'

运行结果:

eof格式的注释内容
感叹号格式注释内容
单引号格式的注释内容

需要注意的是第三种方式冒号和单引号中间有个空格

六、Shell 运算符

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 逻辑运算符
  • 字符串运算符
  • 文件测试运算符

6.1、算术运算符

#!/bin/bash
a=100
b=20
# 加法
val=`expr $a + $b`
echo "a + b : $val"
#减法
val=`expr $a - $b`
echo "a - b : $val"
#乘法(注意转义符号)
val=`expr $a \* $b`
echo "a * b : $val"
#除法
val=`expr $b / $a`
echo "b / a : $val"
#求模
val=`expr $b % $a`
echo "b % a : $val"
#相等判断
if [ $a == $b ]
then
   echo "a 等于 b"
fi
#不相等判断
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

运行结果:

a + b : 120
a - b : 80
a * b : 2000
b / a : 0
b % a : 20
a 不等于 b

需要注意的是:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

6.2、关系运算符

运算符英文全程含义
-eqequal等于
-nenot equal不等于
-gtgreater than大于
-ltless than小于
-gegreater than or equal大于等于
-leless than or equal小于等于
#!/bin/bash

a=100
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi

if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi

if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi

if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi

if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi

if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi

运行结果:

100 -eq 20: a 不等于 b
100 -ne 20: a 不等于 b
100 -gt 20: a 大于 b
100 -lt 20: a 不小于 b
100 -ge 20: a 大于或等于 b
100 -le 20: a 大于 b

需要注意的是:if、[、变量、关系运算符、变量、] 这六者中是有空格的,不要漏了

6.3、布尔运算符

符号英文全程含义
!not非运算
-oor或运算
-aand与运算
#!/bin/bash
  
a=100
b=20

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi

#与运算
if [ $a -lt $b -o $a -lt 200 ]
then
   echo "$a -lt $b -o $a -lt 200: 返回true"
else
   echo "$a -lt $b -o $a -lt 200: 返回false"
fi

#与运算
if [ $a -gt $b -a $a -gt 200 ]
then
   echo "$a -gt $b -a $a -gt 200: 返回true"
else
   echo "$a -gt $b -a $a -gt 200: 返回false"
fi

运行结果:

100 != 20 : a 不等于 b
100 -lt 20 -o 100 -lt 200: 返回true
100 -gt 20 -a 100 -gt 200: 返回false

6.4、逻辑运算符

  &&就是逻辑与,||就是逻辑或

#!/bin/bash

a=100
b=20

if [[ $a -gt 50 && $b -gt 50 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

if [[ $a -gt 50 || $b -gt 50 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

运行结果:

返回 false
返回 true

6.5、字符串运算符

运算符含义使用
= 检测两个字符串是否相等,相等返回 true[ $a = $b ]
!=检测两个字符串是否不相等,不相等返回 true[ $a != $b ]
-z检测字符串长度是否为0,为0返回 true[ -z $a ]
-n检测字符串长度是否不为 0,不为 0 返回 true[ -n “$a” ]
$ 检测字符串是否为空,不为空返回 true[ $a ]
#!/bin/bash

a="abcdefg"
b="hijklmn"

if [ $a = $b ]
then
  echo "$a = $b 测试是否相等,返回true"
else
  echo "$a = $b 测试是否相等,返回false"
fi

if [ $a != $b ]
then
  echo "$a != $b 测试是否不相等,返回true"
else
  echo "$a != $b 测试是否不相等,返回false"
fi

if [ -z $a ]
then
  echo "-z $a 测试是否为0,返回true"
else
  echo "-z $a 测试是否为0,返回false"
fi

if [ -n $a ]
then
  echo "-n $a 测试是否不为0返回true"
else
  echo "-n $a 测试是否不为0,返回false"
fi

if [ $a ]
then
  echo "$a 测试是否为空,返回true"
else
  echo "$a 测试是否为空,返回false"
fi

运行结果:

abcdefg = hijklmn 测试是否相等,返回false
abcdefg != hijklmn 测试是否不相等,返回true
-z abcdefg 测试是否为0,返回false
-n abcdefg 测试是否不为0返回true
abcdefg 测试是否为空,返回true

6.6、文件测试运算符

运算符含义使用
-b file 检测文件是否是块设备文件,如果是,则返回 true[ -b $file ]
-c file 检测文件是否是字符设备文件,如果是,则返回 true[ -c $file ]
-d file 检测文件是否是目录,如果是,则返回 true[ -d $file ]
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true[ -f $file ]
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true[ -g $file ]
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true[ -k $file ]
-p file 检测文件是否是有名管道,如果是,则返回 true[ -p $file ]
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true[ -u $file ]
-r file 检测文件是否可读,如果是,则返回 true[ -r $file ]
-w file 检测文件是否可写,如果是,则返回 true[ -w $file ]
-x file 检测文件是否可执行,如果是,则返回 true[ -x $file ]
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true[ -s $file ]
-e file 检测文件(包括目录)是否存在,如果是,则返回 true[ -e $file ]

  这里的运算符太多就不一一演示了,就挑几个常用的

#!/bin/bash

file="/home/shell/logic.sh"
echo "文件[$file]属性如下:"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi

if [ -w $file ]
then
   echo "文件可写"
else
   echo "文件不可写"
fi

if [ -x $file ]
then
   echo "文件可执行"
else
   echo "文件不可执行"
fi

if [ -f $file ]
then
   echo "文件为普通文件"
else
   echo "文件为特殊文件"
fi

if [ -d $file ]
then
   echo "文件是个目录"
else
   echo "文件不是个目录"
fi

if [ -s $file ]
then
   echo "文件不为空"
else
   echo "文件为空"
fi

if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

运行结果:

文件[/home/shell/logic.sh]属性如下:
文件可读
文件可写
文件可执行
文件为普通文件
文件不是个目录
文件不为空
文件存在

七、Shell echo 命令

  Shell echo 命令用于字符串的输出,我们就说几个常用的

7.1、显示字符串

#!/bin/bash

#不需要双引号
echo study hard and make progress every day
#带双引号
echo "study hard and make progress every day"
#使用转义符显示双引号
echo \"study hard and make progress every day\"

运行结果:

study hard and make progress every day
study hard and make progress every day
"study hard and make progress every day"

7.2、换行与不换行

#!/bin/bash

#-n可以输出不换行
echo -n "Hello ";echo "Shell"
#输出换行
echo -e "我会换行:Echo output wrap \n"
#输出不换行
echo -e "我不会换行:Echo output does not wrap \c"
#输出下一行
echo "isn't it?"

运行结果:

Hello Shell
我会换行:Echo output wrap 

我不会换行:Echo output does not wrap isn't it?

7.3、显示结果定向至文件

#!/bin/bash

echo "Test echo output to file" > echoToFile.txt

如果是追加文件则是由 > 变成 >>

#!/bin/bash

echo "Test echo output to file" >> echoToFile.txt

7.4、显示命令执行结果

#!/bin/bash

#显示当前时间
echo `date`
#显示网络信息
echo "`ifconfig`"

运行结果:

2022年 02月 16日 星期三 10:24:25 CST
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.26.163.146  netmask 255.255.240.0  broadcast 172.26.115.255
        inet6 fe80::216:3eff:fe1c:c5e5  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:1c:c5:e5  txqueuelen 1000  (Ethernet)
        RX packets 764979  bytes 149477332 (142.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 951246  bytes 182426261 (173.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

八、Shell printf 命令

#!/bin/bash

printf "%-10s %-8s %6s %11s\n" 水果 单价 数量 总价
printf "%-10s %-8s %-6d %1.2f\n" 苹果 5.00 10 50.00
printf "%-10s %-8s %-6d %1.2f\n" 香蕉 3.00 5 15.00
printf "%-10s %-8s %-6d %1.2f\n" 樱桃 50.00 2 100.00

运行结果:

水果     单价   数量      总价
苹果     5.00     10     50.00
香蕉     3.00     5      15.00
樱桃     50.00    2      100.00
  • %s %c %d %f都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符, %f输出实数,以小数形式输出。
  • %-8s 指一个宽度为 8 个字符(- 表示左对齐,没有则表示右对齐
  • %1.2f 指格式化为小数,其中 .2 指保留2位小数。

九、Shell test 命令

  首先还是看下前面讲过的运算符的含义,如下:

运算符英文全程含义
-eqequal等于
-nenot equal不等于
-gtgreater than大于
-ltless than小于
-gegreater than or equal大于等于
-leless than or equal小于等于

9.1、数字测试

#!/bin/bash
  
a=100
b=20
if test $[a] -eq $[b]
then
    echo "$a 和 $b 相等!"
else
    echo "$a 和 $b不相等!"
fi

if test $[a] -gt $[b]
then
    echo "$a 大于 $b "
else
    echo "$a 小于 $b"
fi

运行结果:

100 和 20不相等!
100 大于 20

9.2、字符串测试

符号含义
=等于则为真
!=不相等则为真
-z 字符串字符串的长度为零则为真
-n 字符串字符串的长度不为零则为真
#!/bin/bash

a="abcdefg"
b="hijklmn"
if test $a = $b
then
    echo "$a 和 $b 两个字符串相等"
else
    echo "$a 和 $b 两个字符串不相等!"
fi

if test -z $a
then
    echo "$a 字符串长度为零"
else
    echo "$a 字符串长度不为零"
fi

运行结果

abcdefg 和 hijklmn 两个字符串不相等!
abcdefg 字符串长度不为零

9.3、文件测试

  其实文件测试运算符在本文章节6.6已经讲过了就不多说了,具体可以看上面。

十、Shell 流程控制

  Shell里也可以进行流程控制,比如条件判断,循环

10.1、if

  其实前面我们已经见到了很多的if判断,它的语法结构大概如下:

if condition
then
    command
fi

定义一个字符串,如果字符串不为空,则拼接上另外一个字符串,然后输出结果

#!/bin/bash

tempStr="Hello"
if test -n $tempStr
then
    tempStr="$tempStr, Shell"
fi
echo $tempStr

运行结果:

Hello, Shell

10.2、if else

  if else 的语法结构大概如下:

if condition
then
    command1 
else
    command2
fi

定义两个数,判断他们是否相等

#!/bin/bash

a=100
b=20
if test $a -eq $b
then
    echo "$a 和 $b 相等!"
else
    echo "$a 和 $b 不相等!"
fi

运行结果:

100 和 20 不相等!

10.3、if else-if else

  if else-if else 的语法结构大概如下:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
#!/bin/bash

a=100
b=20
if [ $a == $b ]
then
    echo "$a 等于 $b"
elif [ $a -gt $b ]
then
    echo "$a 大于 $b"
else
    echo "$a 小于 $b"
fi

运行结果:

100 大于 20	

注意:else if 实际写法是 elif

10.4、for 循环

  for 循环语法结构大概如下:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

  简单的演示一个for循环

#!/bin/bash
  
for num in 1 2 3 4 5 6
do
    echo "For loop value is: $num"
done

运行结果:

For loop value is: 1
For loop value is: 2
For loop value is: 3
For loop value is: 4
For loop value is: 5
For loop value is: 6

10.5、while循环

  while 循环语法结构大概如下:

while condition
do
    command
done
#!/bin/bash
  
maxcount=3
count=1
pwd="123456"
while [ $count -le $maxcount ]
do
  echo -n "第${count}次输入您的密码:"
  read input
  if [ $pwd -eq $input ]
  then
        echo "第${count}次输入密码正确,登录成功"
        break
  fi

  echo "密码错误,输错${count}次"

  if [ $count -gt $maxcount ]
  then
    echo "密码错误次数达到上限:$maxcount"
    break
  fi
  count=`expr $count + 1`

done

运行结果:

第1次输入您的密码:123123
密码错误,输错1次
第2次输入您的密码:222222
密码错误,输错2次
第3次输入您的密码:123456
第3次输入密码正确,登录成功

10.6、无限循环

  无限循环 就是条件恒为true,无限循环 语法结构大概如下:

while true
do
  command
done

while :
do
  command
done

for (( ; ; ))

10.7、case … esac

  case … esac 循环语法结构大概如下:

case 模式值 in
模式1)
    command1
    ;;
模式2)
    command2
    ;;
esac

  假设通过选择数字去抽奖

#!/bin/bash

echo "输入 1 到 3 之间的数字"
echo -n "你输入的数字为:"
read aNum
case $aNum in
"1")
    echo "恭喜你中了100元!"
    ;;
"2")
    echo "恭喜你中了200元!"
    ;;
"3")
    echo "非常遗憾,没有中奖"
    ;;
esac

运行结果:

输入 1 到 3 之间的数字
你输入的数字为:2
恭喜你中了200元!

输入 1 到 3 之间的数字
你输入的数字为:3
非常遗憾,没有中奖

10.8、break

  我们写一个无限循环来演示用户输入规定范围内的数字,否则退出程序。

#!/bin/bash

while true
do
  echo -n "请输入1到100的数字:"
  read num
  if [[ $num -lt 1 || $num -gt 100 ]]
  then
     echo "对不起,您输入的数字${num}不是1到100中间的数字"
     break
  fi
  echo "您输入的数字是:$num"
done

运行结果:

请输入1到100的数字:1
您输入的数字是:1
请输入1到100的数字:99
您输入的数字是:99
请输入1到100的数字:120
对不起,您输入的数字120不是1到100中间的数字

需要注意的是:如果有多层循环嵌套,break 关键字是跳出当前循环,而不是整个循环。

10.9、continue

我们演示一个输出1到10之间的偶数的需求

#!/bin/bash

for num in 1 2 3 4 5 6 7 8 9 10
do
  if [[ `expr $num % 2` != 0 ]]
  then
     continue
  fi
  echo "得到的偶数:${num}"
done

运行结果:

得到的偶数:2
得到的偶数:4
得到的偶数:6
得到的偶数:8
得到的偶数:10

十一、Shell 传递参数

11.1、基本用法

先看个简单的例子

#!/bin/bash

echo "Shell 传递参数"
echo "执行的文件名:$0"
echo "传入的第一个参数为:$1"
echo "传入的第二个参数为:$2"
echo "传入的第三个参数为:$3"

我们执行:

sh /home/shell/params.sh apple orange banana

运行结果:

Shell 传递参数
执行的文件名:/home/shell/params.sh
传入的第一个参数为:apple
传入的第二个参数为:orange
传入的第三个参数为:banana

11.2、其他参数说明

参数说明
$#传递到脚本的参数个数
$*一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数
$-显示Shell使用的当前选项,与set命令功能相同
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

我们分别看看效果

#!/bin/bash

echo "1、执行脚本传递的参数的个数:$#"
echo "2、执行脚本传递的所有参数(一个单字符串):$*"
echo "3、脚本运行的当前进程ID(重要):$$"
echo "4、后台运行的最后一个进程的ID号:$!"
echo "5、Shell使用的当前选项:$-"
echo "6、命令的退出状态:$?"
echo "7、\$@使用,记得加双引号"
for var in "$@"
do
   echo $var
done

运行结果:

1、执行脚本传递的参数的个数:3
2、执行脚本传递的所有参数(一个单字符串):apple orange banana
3、脚本运行的当前进程ID(重要):1338260
4、后台运行的最后一个进程的ID号:
5、Shell使用的当前选项:hB
6、命令的退出状态:0
7、$@使用,记得加双引号
apple
orange
banana

十二、函数

12.1、简单使用

  在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…,具体可以看下例:

#!/bin/bash

testFuction(){
    echo "接收到函数调用"
    echo "传递进来的参数有:$*"
    echo "姓名:$1"
    echo "性别:$2"
    echo "年龄:$3"
}

echo "-----函数调用开始-----"
testFuction Alian 男 18
echo "-----函数调用结束-----"

运行结果:

-----函数调用开始-----
接收到函数调用
传递进来的参数有:Alian 男 18
姓名:Alian
性别:男
年龄:18
-----函数调用结束-----

12.2、获得函数的返回值

  函数的返回值一般是0和1,表示成功和失败

#!/bin/bash

add(){
  echo "加法计算"
  return `expr $1 + $2`
}
add 1 2
echo "加法计算的结果:$?"

运行结果:

加法计算
加法计算的结果:3

  看似我们通过$?能得到结果3,好像是对的,但是呢,函数默认情况下返回值是0-255,如果超过了就会从0开始,比如计算add 200 58就会得到2了。
  Shell 函数中的 return 关键字用来表示函数的退出状态,而不是函数的返回值,如果一定要返回其他整数,定义一个全局变量,在函数中改变它。

#!/bin/bash

res=0
dosomething(){
  echo "加法计算"
  echo "其他操作..."
  echo "其他操作..."
  res=`expr $1 + $2`
}
dosomething 200 58
echo "加法计算的结果:$res"

运行结果:

加法计算
其他操作...
其他操作...
加法计算的结果:258

12.3、函数赋值说明

  看如下代码

#!/bin/bash

newAdd(){
  echo "新加法计算"
  echo "被加数:$1"
  echo "加数:$2"
  return `expr $1 + $2`
}
res=`newAdd 1 2`
echo "加法计算的结果:$res"

运行结果:

加法计算的结果:新加法计算
被加数:1
加数:2

  并没有得到我们预期的结果3,实际上res=`newAdd 1 2`是将函数newAdd的标准输出传递给res

结语

  Shell的语法比较简单和其他语言相比,相同中带着不同,主要还是需要多去实践和练习。

这篇关于Linux中Shell编程入门汇总的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!