第一章 什么是shell
shell的定义
在计算机科学中,Shell就是一个命令解释器。
shell是位于操作系统和应用程序之间,是他们二者最主要的接口,shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。
shell位置图
总结:
一句话,shell就是在操作系统和应用程序之间的一个命令翻译工具。
shell的分类
命令行式shell
- windows系统:
cmd.exe 命令提示字符 - linux系统:
sh / csh / ksh / bash / …
我们常说的shell是命令行式的shell,在工作中常用的是linux系统下的bash
查看系统shell信息
查看当前系统的shell类型: echo $SHELL
查看当前系统环境支持的shell:[root@linux-node1 ~]# cat /etc/shells
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
shell 脚本
shell使用方式
-
手工方式:
手工敲击键盘,在shell的命令行输入命令,按Enter后,执行通过键盘输入的命令,然后shell返回并显示命令执行的结果.
重点:逐行输入命令、逐行进行确认执行 -
脚本方式:
就是说我们把手工执行的命令a,写到一个脚本文件b中,然后通过执行脚本b,达到执行命令a的效果.
shell脚本示例
现在我们来使用脚本的方式来执行以下
#!/bin/bash
### 这是临时shell脚本
echo 'nihao'
echo 'itcast'
脚本执行语句:
[root@linux ~]# /bin/bash itcast.sh
,执行方式为/bin/bash 文件名(shell脚本为.sh结尾)
执行结果为:
nihao
itcast
第 2 章 SHELL 基础知识
shell脚本
创建脚本
-
脚本创建工具:
创建脚本的常见编辑器是 vi/vim. -
脚本命名
shell脚本的命名简单来说就是要有意义,方便我们通过脚本名,来知道这个文件是干什么用的。 -
脚本内容:
各种可以执行的命令 -
注释内容:
单行注释:
除了首行的#不是注释外,其他所有行内容,只要首个字符是#,那么就表示该行是注释
例:
#!/bin/bash
echo '1'
# echo '2' # 这一行就表示注释
echo '3'
- 多行注释:
多行注释有两种方法::<<! … ! 和:<<字符 ... 字符
#!/bin/bash
echo '1'
:<<! echo '2'
echo '3'
echo '4'
!
echo '5'
脚本执行
shell执行的方式
Shell脚本的执行通常可以采用以下几种方式
bash pyhello.sh
或
/bin/bash pyhello.sh
(强烈推荐使用)
- 添加权限
chmod +x pyhello
脚本开发规范
- 1、脚本命名要有意义,文件后缀是.sh
- 2、脚本文件首行是而且必须是脚本解释器
#!/bin/bash - 3、脚本文件解释器后面要有脚本的基本信息等内容
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等 - 4、脚本文件常见执行方式:bash 脚本名
- 5、脚本内容执行:从上到下,依次执行
- 6、代码书写优秀习惯;
1)成对内容的一次性写出来,防止遗漏。
如:()、{}、[]、’’、``、""
2)[]中括号两端要有空格,书写时即可留出空格[ ],然后再退格书写内容。
3)流程控制语句一次性书写完,再添加内容 - 7、通过缩进让代码易读;(即该有空格的地方就要有空格)
变量
变量的定义和分类
- 本地变量
- 全局变量
- shell内置变量
变量是什么?
变量包括两部分:
变量名 不变的
变量值 变化的
我们一般所说的变量指的是:变量名
本地变量
-
本地变量就是:在当前系统的某个环境下才能生效的变量,作用范围小。
本地变量包含两种:普通变量和命令变量 -
普通变量:
普通变量的定义方式有如下三种,接下来我们就分别说一下这三种方式: -
方式一:
变量名=变量值
重点:
变量值必须是一个整体,中间没有特殊字符 -
方式二:
变量名='变量值'
重点:
我看到的内容,我就输出什么内容 -
方式三:
变量名="变量值"
重点:
如果变量值含有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B
命令变量
命令变量有两种定义方式:
-
定义方式一:
变量名=命令
注意:
` 是反引号 -
定义方式二:
变量名=$(命令)
全局变量
全局变量就是:在当前系统的所有环境下都能生效的变量。
- 查看全局变量命令
可以通过命令查看环境变量
env 只显示全局变量
定义全局变量
- 方法一:
变量=值
export 变量 - 方法二:(最常用)
export 变量=值
变量查看和取消
查看变量:
-
方式一:
$变量名
-
方式二:
${变量名} 场景: echo " dsa dsafsa dsafsa ${变量名} f "
-
方式四:使用频率较高
"${变量名}" 场景: 标准使用方式
取消变量
unset 变量名
shell内置变量
- 和脚本文件有关
符号 | 意义 |
---|---|
$0 | 获取当前执行的shell脚本文件名,包括脚本路径 |
$n | 获取当前执行的shell脚本的第n个参数值,n=1…9,当n为0时表示脚本的文件名,如果n大于9就要用大 括号括起来${10} |
$# | 获取当前shell命令行中参数的总个数 |
$? | 获取执行上一个指令的返回值(0为成功,非0为失败) |
重点内置变量演示效果:
$0 获取脚本的名称
示例:
#!/bin/bash
# 获取脚本的名称
echo "我脚本的名称是: file.sh"
echo "我脚本的名称是:$0"
$# 获取当前脚本传入参数的数量
$n 获取当前脚本传入的第n个位置的参数
示例:
#!/bin/bash
# 获取当前脚本传入的参数数量
echo "当前脚本传入的参数数量是: $#"
# 获取指定位置的参数
echo "第一个位置的参数是: $1"
echo "第二个位置的参数是: $2"
echo "第三个位置的参数是: $3"
echo "第四个位置的参数是: $4"
$? 获取文件执行或者命令执行的返回状态值
示例:
# bash nihao
bash: nihao: No such file or directory
# echo $?
127
# ls
file1.sh num.sh test.sh weizhi.sh
# echo $?
0
---------------
字符串精确截取
格式:${变量名:起始位置:截取长度}
示例:
名称 | 含义 |
---|---|
${file:0:5} | 从第1个字符开始,截取5个字符 |
${file::5} | 从第1个字符开始,截取5个字符 |
${file:5:5} | 从第6个字符开始,截取5个字符 |
${file:5} | 从第6个字符开始,截取后面所有的字符 |
${file:0-5} | 从倒数第5个字符开始,截取后面所有的字符 |
${file:0-6:3} | 从倒数第6个字符开始,截取之后的3个字符 |
默认值相关
-
场景一:
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容格式:
${变量名:-默认值}
套餐示例:
如果我输入的参数为空,那么输出内容是 “您选择的套餐是: 套餐 1”
如果我输入的参数为n,那么输出内容是 “您选择的套餐是: 套餐 n”
#!/bin/bash
# 套餐选择演示
a="$1"
echo "您选择的套餐是: 套餐 ${a:-1}"
- 场景二:
无论变量a是否有内容,都输出默认值
格式:
${变量名+默认值}
场景示例:
不管我说国家法定结婚年龄是 多少岁,都输出 国家法定结婚年龄(男性)是 22 岁
#!/bin/bash
# 默认值演示示例二
a="$1"
echo "国家法定结婚年龄(男性)是 ${a+22} 岁"