目录
初识shell
第一个脚本文件
注释
变量
数组
算术运算符
test命令(Shell [])及Shell [[]]
字符串运算符
关系运算符
布尔运算符
逻辑运算符
判断语句
选择语句
循环语句
函数
初识shell
- 在计算机科学中,shell就是一个命令解释器
- shell是位于操作系统和应用程序之间,是它们二者最主要的接口
- shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序
- 一句话:
- shell就是在操作系统和应用程序之间的一个命令翻译工具
- Windows和Linux中的shell
- Windows:
- cmd.exe 命令提示字符
- Linux:
- sh/csh/ksh/bash/...
- 默认使用bash
- 使用方式
- 手工方式
- 直接输入命令,按Enter后执行命令
- 逐行输入命令,逐行进行确认执行
- 脚本方式
- 把手工执行的命令,写到一个文件中,然后运行这个文件,达到执行命令的效果
- 这个文件就叫脚本文件
- 第一个脚本文件
- 新建一个文件后缀名为sh
- 书写内容
- 第一行 #!/bin/bash 声明这个 脚本 使用的shell版本:
- 因为shell有很多种类型 比如sh,bash,csh,tcsh
- 如果不指定版本 系统会不知道用哪一个版本的shell去处理这个脚本所以会报错
- 一般linux发行版默认内置的是bash
- 所以一般是写#!/bin/bash
- 运行程序
- bash 文件名.sh
- 注释
- 单行注释
- 就是前面加了个#
- # 注释的内容
- 多行注释
- 第一种(习惯)
-
:<
第二种
-
:<<字符 注释的内容 字符
- 变量
- 定义变量
- 普通变量
- 方式一
- 变量名=变量值
- 变量值必须是一个整体,中间没有特殊字符
- 例:
- number=10
- echo $number(前面加$表示使用变量,否则会当普通字符处理)
- 方式二
- 变量名='变量值'
- 只会原样赋值
- 例:
-
number=10 a='$number' echo $a
输出$number;而不是10
- 方式三
- 变量名="变量值"
- 如果双引号里面有其它变量,会把变量的结果进行拼接,然后赋值
- 例:
-
number=10 a="$number" echo $a
输出10
- 习惯:
- 数字不加引号,其它默认加双引号
- 命令变量
- 方式一
- 变量名=`命令`
- 方式二
- 变量名=$(命令)
- 效果一样,但第二种可读性更高
- 都是将命令的运行结果赋值给变量
- 例:
-
c=`date` echo $c d=$(date) echo $d
- 使用变量
- 方式一
- $变量名 非标准写法,图省事
- 方式二
- "$变量名" 非标准写法,图省事
- 方式三
- ${变量名} 在双引号里面要使用变量的值
- 方式四
- "${变量名}" 标准使用方式
- 例:
-
d=$(date) result="现在的时间为${d}" echo "${result}"
只读变量
- readonly 变量名
- 只读不能再赋值
- 删除变量
- unset 变量名
- 数组
- 定义数组
- 数组名=(值1 值2 值3....值n)
- 例:
- arr=(1 2 3 4 5)
- 给数组的元素赋值
- 数组名[索引]=值
- 例:
- arr[0]=1
- 获取元素
- ${数组名[下标]}
- 例:
- ${arr[0]}
- 使用@或*可以获取数组中的所有元素
- 例:
- ${arr[*]}
- ${arr[@]}
- 拼接数组
- 先利用@或*,将数组扩展成列表,然后再合并到一起
- array_new=(${array1[@]} ${array2[@]})或array_new=(${array1[*]} ${array2[*]})
- 例:
-
array1=(23 56) array2=(99 "http://c.biancheng.net/shell/") array_new=(${array1[@]} ${array2[*]}) echo ${array_new[@]}#也可以写作 ${array_new[*]}
- 删除数组元素
- 使用 unset 关键字来删除数组元素
- unset array_name[index]
- 删除整个数组
- unset array_name
- 获取长度
- ${#数组名[*]}
- 或
- ${#数组名[@]}
- 例:
-
echo "数组的长度${#arr[*]}" echo "数组的长度${#arr[@]}"
算术运算符 - 1.原生的bash不支持简单的数学运算
- 可以通过其它命令实现
- 用于整数运算,效率很高
- (( ))
- 可用于整数运算,也可以处理字符串
- expr
- Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器
- bc
- 2.表示式和运算符之间要有空格
- 3.完整的表达式要被反引号包含
- 例:
-
`expr 2 + 2` #整数相加 num1=`expr 2 + 2` num1=$(( 2 + 2 )) echo "整数2+2的结果为$num1" #整数相减 num2=`expr 2 - 2` num2=$(( 2 - 2 )) echo "整数2-2的结果为$num2" #整数相乘 num3=`expr 2 \* 2`(斜杠表转义) num3=$(( 2 * 2 )) echo "整数2*2的结果为$num3" #变量相加 a=10 b=20 num4=`expr $a + $b` echo "变量a和变量b相加的结果为$num4" #赋值 c=30 num5="${c}" echo "变量c的值赋值给num5,打印num5的值$num5" #自增 e=1 ((e++)) echo "变量e为1,自增之后,结果为$e"
test命令(Shell [])及Shell [[]] - test 是 Shell 内置命令,用来检测某个条件是否成立
- test 通常和 if 语句一起使用,并且大部分 if 语句都依赖test
- 用法
- test expression
- 当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值
- test 命令也可以简写为[]
- [ expression ]
- 注意[]和expression之间的空格,这两个空格是必须的,否则会导致语法错误
- []的写法更加简洁,比 test 使用频率高
- [[ ]]是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立
- 可以认为 [[ ]] 是 test 的升级版,对细节进行了优化,并且扩展了一些功能
- 用法
- [[ expression ]]
- 当 [[ ]] 判断 expression 成立时,退出状态为 0,否则为非 0 值
- 注意[[ ]]和expression之间的空格,这两个空格是必须的,否则会导致语法错误
- 字符串运算符
- 在以下:真返回0,假返回1
- 检测两个字符串是否相等,相等返回true
- =
- 例:
-
a="aaa" b="bbb" [ "${a}" = "${b}" ]
检测两个字符串是否不相等,不相等返回true
- !=
- 例:
-
[ "${a}" != "${b}" ]
检测字符串长度是否为0,为0返回true
- -z
- 例:
-
[ -z "${a}" ]
检测字符串长度是否不为0,不为0返回true
- -n
- 例:
-
[ -n "${a}" ]
检测字符串是否为空,不为空返回true
- $
- 例:
-
[ $a ] [ $"{$a}" ]
配合上面任何语句使用
- 获取上一条语句的执行结果
- $?
- 获取字符串长度
-
echo "字符串长度为 ${#a}"
关系运算符 - 还是0为真,1为假
- 检测两个数是否相等,相等返回true
- -eq(equals)
- 例:
-
[ "${a}" -eq "${b}" ]
检测两个数是否不相等,不相等返回true
- -ne(not equals)
- 例:
-
[ "${a}" -ne "${b}" ]
检测左边的数是否大于右边的,如果是,则返回true
- -gt(greater than)
- 例:
-
[ "${a}" -gt "${b}" ]
检测左边的数是否小于右边的,如果是,则返回true
- -lt(less than)
- 例:
-
[ "${a}" -lt "${b}" ]
检测左边的数是否大于等于右边的,如果是,则返回true
- -ge(greater equals)
- 例:
-
[ "${a}" -ge "${b}" ]
检测左边的数是否小于等于右边的,如果是,则返回true
- -le(less equals)
- 例:
-
[ "${a}" -le "${b}" ]
- 布尔运算符
- 0是真,1是假
- 取反运算
- !
- [ ! false ]返回true
-
a=10 [ ! "${a}" -eq 10 ] echo "$?"
- 或运算,有一个表达式为true则返回true
- -o(or)
- 例:
-
a=10 b=20 [ "${a}" -lt 20 -o "${b}" -gt 100 ]
理解:(a<20||b>100)
- 输出0
- 与运算,两个表达式都为true才返回true
- -a(and)
- 例:
-
a=10 b=20 [ "${a}" -lt 20 -a "${b}" -gt 100 ]
理解:(a<20&&b>100)
- 输出1
- 逻辑运算符
- 0就是真,1就是假
- 必须写在双括号中
- 逻辑的and
- &&
- 例:
-
a=10 b=20 [[ "${a}" -lt 100 && "${b}" -gt 100 ]] echo $?
输出1
- 逻辑的or
- ||
- 例:
-
a=10 b=20 [[ "${a}" -lt 100 || "${b}" -gt 100 ]] echo $?
输出0
- 判断语句
-
文章图片
- 第1种
- 满足if中的条件就执行then里的语句体,不满足条件就不执行then里的语句体
- fi表判断语句的结束标记
- 第2种
- 满足if中的条件就执行then里的语句体,不满足条件就执行else里的语句体
- 第3种
- elif后也要跟一个then
- 满足if中的条件就执行then里的语句体,不满足条件就看看下一个elif是否满足条件,满足则执行,后面的就不再判定了,要是所有if和elif条件都不满足,则执行else里的语句体
- 例:
-
#查找一个进程 ,如果这个进程存在,就打印true if [ $(ps -ef | grep -c "ssh" ) -gt 1 ] then echo "true" fi #定义a和b两个变量,针对于相等,大于,小于进行三种提示 a=10 b=20 if [ "${a}" -eq "${b}" ] then echo "相等" elif [ "${a}" -lt "${b}" ] then echo "a小于b" else echo "a大于b" fi #输出a小于b
选择语句 - 形式
文章图片
- 模式1若与值匹配则执行语句1,然后通过; ; (相当于break)跳出,后面的不再执行
- 每个模式后接一个)来划分模式内容
- esac表示选择语句的结束标记
- 例:
-
v="ccpc" case "${v}" in "ccpc") echo "中国大学生程序设计大赛" ; ; "74181") echo "最著名的算术逻辑单元" ; ; "Redhat") echo "红帽" ; ; esac #输出中国大学生程序设计大赛
循环语句 - for循环
文章图片
- done为结束标记
- loop相当于以前for循环定义的i变量
- 首先loop为A,然后为B,C
- 当所有循环全部执行就会走到done
- 例:
-
#(依次输出A,B,C,D,E,F) for var in A B C D E F do echo "${var}" done
- while循环
文章图片
- 如果条件为真,就会到循环体里执行
- 如果条件为假,整个循环就停止了
- done就是结束标记
- 例:
-
#(依次输出1,2,3,4,5,6,7,8,9,10) a=1 while [ "${a}" -le 10 ] do echo "${a}" ((a++)) done
函数 - 无参无返回值的方法
文章图片
-
method(){ echo "我执行了" } #方法的调用 method #(输出"我执行了")
有参无返回值的方法
文章图片
例:
-
method2(){ echo "接收到的第一个参数$1" echo "接收到的第二个参数$2" } #方法的调用 method2 99 88 #运行结果: #接收到的第一个参数99 #接收到的第二个参数88
有参有返回值
文章图片
例:
-
method3(){ echo "接收到的第一个参数$1" echo "接收到的第二个参数$2" return $(($1 + $2)) } #方法的调用 method3 10 20 echo $? #运行结果: #接收到的第一个参数10 #接收到的第二个参数20 #30
- 练习
- read 变量名 --- 表示把键盘录入的数据复制给这个变量
- 例:
-
method(){ echo "请录入第一个数" read number1 echo "请录入第二个数" read number2 echo "两个数字分别为${number 1},${number2}" return $(($number1 + $number2)) } #方法的调用 method echo $? #运行输出: #请录入第一个数 #自己键盘打个数,这里举例录入10 #请录入第二个数 #自己键盘打个数,这里举例录入20 #两个数字分别为10, 20 #30
推荐阅读
- ubuntu|【MobaXterm教程】远程ssh登录与ftp文件传输
- 机器人|ROS机器人Diego 1#制作(七)ROS语音系统
- 在Unix上安装Apache 2.4.6详细步骤
- Linux上的IBM HTTP Server 8.5.5安装指南[详细步骤图解]
- Python开发笔记|[Python]Curl命令模拟与json解析
- linux 设置熄屏时间
- 单例模式|单例模式(饿汉式,dcl懒汉式)
- 服务器|部署小程序的云服务器要注意什么(配置过程是怎么样的?)
- #|【Docker】<云原生>Linux安装Docker(无错完整)