1、shell 基础知识
1). shell是一个程序,文件路径:/bin/bash,是一个命令解释器,所有的linux命令都由它来执行
打开终端,就进入了shell交互式命令
2). shell脚本
后缀为.sh的就是我们所谓的shell脚本文件
tab键没有意义,仅仅是为了美观
单行注释键: # (首行的#不是注释)
多行注释: :<<! ... !
#!/bin/bash
echo 'hello world'
echo 'pen'
:<<!
echo 'book'
!
echo 'phone'
3). 脚本执行方式
1、bash hello.sh 或 /bin/bash hello.sh(推荐)
2、当前路径下执行脚本 ./hello.sh
3、source hello.sh 或 . hello.sh
说明:
方式1.脚本文件本身没有可执行权限或者脚本首行没有命令解释器时使用的方法,我们推荐用bash执行。
方式2.脚本文件具有可执行权限时使用; 添加执行权限: chmod + x 脚本名
方式3. source命令和.命令 通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录
区别:source不会开启新的进程执行脚本,可以跟当前窗口共享进程,共享变量; 其他两种都会开新的进程
《脚本开发规范:》
1. 脚本命名要有意义,文件后缀是.sh
2. 脚本文件首行是而且必须是脚本解释器 #!/bin/bash
3. 脚本文件常见执行方式:bash 脚本名
4. 脚本内容执行:从上到下,依次执行
5. 代码书写
1) 成对内容的一次性写出来,防止遗漏。 如:()、{}、[]、''、``、""
2) []中括号两端要有空格,书写时即可留出空格[ ],然后再退格书写内容。
3) 流程控制语句一次性书写完,再添加内容
4). 变量
1.本地变量 (在当前系统的某个环境下才能生效的变量,作用范围小。)
3种方式赋值
1、name=laowang (等号两边不需要加空格,否则会报错n)
2、name='name is $name' 不会解析引号中的变量
3、name="name is $name" 会解析引号中的变量
习惯: 数字不加引号,其他默认加双引号
echo $name ($变量名 , 输出时,变量前面需要加上 ‘$’ 符号 )
2. 命令变量
执行命令,把命令返回的结果交给变量
1、name=`pwd` (`` 这两个为反引号,shift +` )
2、name=$(pwd)
3. 全局变量( 在当前系统的所有环境下都能生效的变量 )
查看全局变量命令:
env 只显示全局变量
env | grep SHELL (grep 过滤)
1、name="wang"
export name
env | grep name
2、export age=123 (最常用)
export 这种方式,变量的作用范围是当前窗口及子进程
#如果想让全局变量永久生效,并且任何一个窗口都有效,需要修改文件/etc/profile
export age=123,重新启动系统
4. 使用变量
1、 $变量名 echo $name
2、echo "$name"
3、echo ${name}
4、"${变量名}" echo "${name}" -- 这个是最规范的
## $变量名 与 "$变量名"是一致的,说明 双引号对变量的引用没有影响。
5.删除变量
unset 变量名 unset name
6. shell 内置变量
$0 获取当前执行的脚本文件名称, 包括脚本路径
$n $1...$9 获取第几个参数,如果n>9,需要${10}
$# 获取当前shell命令行中参数的总个数
echo $? 返回上一条命令的结果,0代表上一条命令执行成功,非0是失败
说明: 如果上一条命令时运行一个脚本,$?返回的上脚本中的最后一行命令的结果
# 示例:
1 #!/bin/bash
2
3 #$0 表示脚本的名称
4 echo "脚本的名称为:$0"
5
6 #$n 表示接受脚本传入的参数
7 echo "脚本参数1:$1"
8 echo "脚本参数2:$2"
9 echo "脚本参数3:$3"
10
11 # $# 表示传入参数的个数
12 echo "脚本参数个数: $#"
# 执行:
[root@VM-0-12-centos shell_operation]# bash test01.sh one two three
脚本的名称为:test01.sh
脚本参数1:one
脚本参数2:two
脚本参数3:three
脚本参数个数: 3
[root@VM-0-12-centos shell_operation]# echo $?
0
[root@VM-0-12-centos shell_operation]#
7. 字符串精确截取
格式:${变量名:起始位置:截取长度}
[root@VM-0-12-centos shell_operation]# name="abcdef"
[root@VM-0-12-centos shell_operation]# echo ${name:0:2}
ab
示例:
${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个
8. 默认值
方式一: ${变量名:-默认值}
echo ${name:-123} 如果name有值,就不采用默认值,如果name没有值,就采用默认值
方式二: ${变量名+默认值} 无论变量a是否有内容,都输出默认值
echo ${name+123} 无论name是否有值,都采用默认值。
(测试发现,变量需要先赋值,默认值才生效,否则为空)
2、shell 进阶
1)表达式
1. 测试语句 —— 用 $? 来判断是否执行成功,0:表示成功; 1: 表示失败
1). 等号左右必须有空格
test 1 = 1
2). [ ] 括号左右都需要空格,两个比较的值之间必须要有空格 -- 这个比较常用
[ 1 = 2 ]
2. 表达式分类 -- 逻辑表达式
常见的逻