Linux中Shell编程入门汇总
2022/3/3 7:16:11
本文主要是介绍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、关系运算符
运算符 | 英文全程 | 含义 |
---|---|---|
-eq | equal | 等于 |
-ne | not equal | 不等于 |
-gt | greater than | 大于 |
-lt | less than | 小于 |
-ge | greater than or equal | 大于等于 |
-le | less 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 | 非运算 |
-o | or | 或运算 |
-a | and | 与运算 |
#!/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 命令
首先还是看下前面讲过的运算符的含义,如下:
运算符 | 英文全程 | 含义 |
---|---|---|
-eq | equal | 等于 |
-ne | not equal | 不等于 |
-gt | greater than | 大于 |
-lt | less than | 小于 |
-ge | greater than or equal | 大于等于 |
-le | less 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编程入门汇总的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法