shell概述
一、shell 和 shell 脚本
- Shell 是一个用 C 语言编写的程序,提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 既是一种命令语言,又是一种程序设计语言
- Shell 脚本是一种为 shell 编写的脚本程序,通常所说的 shell 通常都是指 shell 脚本,但本质上 shell 和 shell script 是两个不同的概念,一般情况下我们所说的 shell 就是指 shell 脚本
二、shell 环境
1、Linux 的 Shell 常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
2、此教程以 bash 为基础进行说明
三、第一个 shell 脚本
1、文本编辑
#!/bin/bash echo "Hello World !"
2、shell的两种执行方法
- 作为可执行程序直接执行:先到 PATH 路径找文件,找不到再到当前的目录找
chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本
- 作为解释器参数:这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用
/bin/sh test.sh /bin/php test.php
shell 变量 & 传参
一、变量
1、变量
- 变量的定义、使用和删除
your_name="qinjx" #define echo $your_name echo ${your_name} #use unset myUrl #delete
-
只读变量:不能重赋值和删除
myUrl="http://www.google.com" readonly myUrl myUrl="http://www.runoob.com"
-
环境变量:所有的shell脚本都可以使用;局部变量:只有当前的脚本可以使用
- 注意:变量名和等号之间不能有空格,这可能和其他所有编程语言都不一样
2、字符串
- 概述:
- 字符串单双引号都可以使用但是存在一些差异
- 双引号可以输出变量,双引号可以使用转译字符
- 单引号的话所有的内容都是原样输出
- 拼接:单双引号都可以用来拼接
# 使用双引号拼接 greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1
- 获取长度:echo ${#string}
- 提取子串:echo ${string:1:4}
- 查找子串:echo `expr index "$string" io` #找字符串中 I O的位置,其中使用的是反引号
3、数组
- 只支持一维,不限定大小
- 基本的使用
array_name=(value0 value1 value2 value3) valuen=${array_name[n]} echo ${array_name[@]} #获取所有元素 length=${#array_name[@]}# 取得数组元素的个数
4、注释
- 多行: :<<EOF content EOF
- 单行: #
二、传递参数
1、基本使用
- 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n,n 代表执行脚本的第 n 个参数
#!/bin/bash echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3";
2、补充说明
- 几个特殊字符
#!/bin/bash echo "Shell 传递参数实例!"; echo "第一个参数为:$1"; echo "参数个数为:$#"; echo "传递的参数作为一个字符串显示:$*";
- $* 与 $@ 区别:二者都是引用所有参数;假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(一个数组)
数组 & 运算符
一、数组:见上文
二、运算符
1、算数运算符
- 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
#!/bin/bash val=`expr 2 + 2` echo "两数之和为 : $val" #表达式和运算符之间要有空格,必须写成 2 + 2,这与大多数编程语言不一样 #完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边
- 基本的使用和其他语言几乎一致,需要注意:
- 条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]
- 乘号(*)前边必须加反斜杠(\)才能实现乘法运算
2、关系运算符
- 关系运算符只支持数字,不支持字符串,除非字符串的值是数字
- 运算符:-eq -ne -gt -lt -ge -le
3、布尔运算符
- 就是与(-a)或(-o)非(!)的运算
- 还有逻辑运算符就是 && ||
4、字符串运算符
- = 和 !=:是否相等
- -z 和 -n:长度是否为0
- $ :是否为空
5、文件测试运算符
-
常用的有:(-r -w -x -f -d -s -e)其中-s检测文件是否为空,-e检测文件是否存在
常用命令
一、echo
1、-e 选项代表要解释转译字符
2、显示结果输出到文件:echo "It is a test" > myfile
3、显示命令执行的结果:echo `date`
二、printf
#!/bin/bash printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
三、test
1、数值测试
- 代码中的 [] 执行基本的算数运算
#!/bin/bash a=5 b=6 result=$[a+b] # 注意等号两边不能有空格 echo "result 为: $result"
2、文件测试
- Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来
cd /bin if test -e ./notFile -o -e ./bash then echo '至少有一个文件存在!' else echo '两个文件都不存在' fi
3、字符串测试
num1="ru1noob" num2="runoob" if test $num1 = $num2 then echo '两个字符串相等!' else echo '两个字符串不相等!' fi
流程控制 &函数
一、流程控制
1、if 语句:通常和 test 命令结合使用
a=10 b=20 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi
2、for 语句:in列表是可选的,如果不用它,for循环使用命令行的位置参数
for loop in 1 2 3 4 5 do echo "The value is: $loop" done
3、while 语句
- 基本循环:bash let 命令,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
#!/bin/bash int=1 while(( $int<=5 )) do echo $int let "int++" done
- while循环可用于读取键盘信息
echo '按下 <CTRL-D> 退出' echo -n '输入你最喜欢的网站名: ' while read FILM do echo "是的!$FILM 是一个好网站" done
- 无线循环
4、until 语句
- until 循环执行一系列命令直至条件为 true 时停止,while是条件为false停止,一般都是用while
#!/bin/bash a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done
5、case 语句:和java的switch类似
echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
6、跳出循环:break 和 continue 和java中的用法是一致的
二、函数
1、函数使用的注意点
- 函数返回值在调用该函数后通过 $? 来获得
- 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分
- 调用函数仅使用其函数名即可
- 函数的参数传递和上文的传递参数是一回事,不放过参数的个数超过 10 个的时候用 ${10}
2、使用示例
funWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn echo "输入的两个数字之和为 $? !"
输入输出重定向 & 文件包含
一、输入输出重定向
1、输出重定向
- 覆盖:command > file
- 追加:command >> file
2、输入重定向
cat < users grep 2019 < users cat <users> outuser #将users的文件内容写到 outuser 文件里
3、here document:示例会输出两个EOF之间的内容
cat << EOF 欢迎来到 菜鸟教程 www.runoob.com EOF
4、dev/null 文件 :作用就是输出的禁用,这个文件读取不到任何的内容
ls >> /dev/null
二、文件包含
1、shell 也可以在一个脚本里引用另一个脚本的内容
2、示例
- test1.sh
#!/bin/bash url="http://www.runoob.com"
- test2.sh
#!/bin/bash #使用 . 号来引用test1.sh 文件 . ./test1.sh # 或者使用以下包含文件代码 # source ./test1.sh echo "菜鸟教程官网地址:$url"
- test2.sh添加权限并执行