shell脚本的基础

shell脚本的基础

shell基本语法

什么是shell?

Shell 是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可以是交互式也可以是非交互式的
在这里插入图片描述

什么是shell脚本?

shell 脚本:就是说我们把原来 linux 命令或语句放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为 shell 脚本或 shell 程序;我们可以在脚本中输入一系列的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们有机结合起来就形成了一个功能强大的 shell 脚本。

创建shell程序的步骤
第一步:创建一个包含命令和控制结构的文件。
第二步:修改这个文件的权限使它可以执行。 使用 chmod +x test.sh
第三步:检测语法错误 bash -x abc.sh
第四步:执行 ./example

shell脚本的执行方式
1、/root/test.sh 或者 ./test.sh (当前路径下执行脚本的话要有执行权限 chmod +x test.sh)
2、bash test.sh 或 sh test.sh (这种方式可以不对脚本文件添加执行权限)
3、source test.sh (可以没有执行权限) . test.sh
4、sh < test.sh 或者 cat test.sh | sh

source 使用当前 bash 进程来执行的

**举例**
[root@ ~]# history #查看历史命令
[root@ ~]# vim test.sh #编辑脚本清空历史命令
history -c
[root@ ~]# chmod +x test.sh
[root@ ~]# ./test.sh
[root@ ~]# history #为什么没有清空历史命令?
因为新开了一个 bash 进程执行的
[root@ ~]# source test.sh #用 source 来执行 test.sh
[root@ ~]# history #命令被清空

shell变量及运用

shell变量

变量是 shell 传递数据的一种方法。变量是用来代表每个值的符号名。我们可以把变量当成一个容器,通过变量,可以在内存中存储数据。也可以在脚本执行中进行修改和访问存储的数据

变量的设置规则
1.变量名称通常是大写字母,它可以由数字、字母(大小写)和下划线_组成。变量名区分大小写;不能以数字开头
2.等号 = 用于为变量分配值,在使用过程中等号两边不能有空格
3.变量存储的数据类型是整数值和字符串值
4.在对变量赋于字符串值时,建议大家用引号将其括起来。因为如果字符串中存在空格符号。需要使用单引号或双引号
5.要对变量进行调用,可以在变量名称前加美元符号$
6.如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“ 变量名”或用 变量名”或用 变量名或用{变量名}包含

变量的分类

按照变量的作用可以分成 4 类:
1、用户自定义变量
2、环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
3、位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。$1 $2 …
4、预定义变量:是 Bash 中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

按照变量作用域可以分成 2 类:
局部变量:是 shell 程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括:用户自定义变量、位置变量和预定义变量。
全局变量:是环境变量,其值不随 shell 脚本的执行结束而消失。

用户定义变量

变量名命名规则:由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,并且大小写字母意义不同。在使用变量时,在变量名前加$

**例 1:给变量 var1 赋值**
[root@ ~]# var1=123
[root@ ~]# echo $var1
123

**例2:变量名称的界定范围,使用${}** 
$name 与${name}是没有区别的,但是用${ }会比较精确的界定变量名称的范围
[root@ ~]# var4=mysql
[root@ ~]# echo $var4
mysql
[root@ ~]# echo $var4-db.log
mysql-db.log
[root@ ~]# echo $var4.db.log
mysql.db.log
[root@ ~]# echo $var4db.log #发现输出的结果不是我们想要的,怎么办?
.log
[root@ ~]# echo ${var4}db.log
mysqldb.log

环境变量

在 bash shell 中,变量分为两类:全局变量和局部变量
全局变量:对于 shell 会话和所有的子 shell 都是可见的
局部变量: 它只在自己的进程当中使用

**例 1:局部变量**
[root@ ~]# var1=111
[root@ ~]# var2=222
[root@ ~]# echo $var1
111
[root@ ~]# vim a.sh
#!/bin/bash
echo $var1
echo $var2
[root@ ~]# echo $var1 $var2
111 222
[root@ ~]# bash a.sh #执行 a.sh 时,会新开一个 bash 进程去执行,就访问不到$var1 和 var2 的值
[root@ ~]# source a.sh #使用 source 执行 a.sh 时,使用当前 bash 进程去执行,可以访问到$var1 和 var2 的值
111
222

**例 2:使用 export 把这个 var1 局部变量输出为全局变量**
[root@ ~]# export var1=xuegod
[root@~]# echo $var1 $var2
xuegod 222
[root@ ~]# cat a.sh
#!/bin/bash
echo $var1
echo $var2
[root@ ~]# bash a.sh #引用全局变量 var1 成功

shell 位置变量

Shell 解释执行用户的命令时,将命令行的第一个字符作为命令名,而其它字符作为参数。
$0 获取当前执行 shell 脚本文件的文件名,包括脚本路径,命令本身
n 获取当前脚本的第 n 个参数 n = 1 , 2..... n 当 n 大于 9 时用 n 获取当前脚本的第 n 个参数 n=1,2.....n 当 n 大于 9 时 用 n获取当前脚本的第n个参数n=1,2.....nn大于9时用{10}表示。

**示例**
[root@ ~]# vim print.sh
#!/bin/bash
echo "本 shell 脚本的文件名: $0"
echo "第 1 个参数: $1"
echo "第 2 个参数: $2"
echo "第 3 个参数: $3"
echo "第 4 个参数: $4"
[root@ ~]# chmod +x print.sh
[root@ ~]# ./print.sh 111 222 a.txt 444
本 shell 脚本的文件名: ./print.sh
第 1 个参数: 111
第 2 个参数: 222
第 3 个参数: a.txt
第 4 个参数: 444

特殊变量(预定义变量)

有些变量是一开始执行 Script 脚本时就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量。这些变量当执行程序时就有了,以下是一些特殊变量:
∗ 以一个单字符串显示所有向脚本传递的参数;如 " *以一个单字符串显示所有向脚本传递的参数;如" 以一个单字符串显示所有向脚本传递的参数;如"*“用【”】括起来的情况、以"$1 $2 … $n"的形式输出所有参数
$# 传递到脚本的参数个数
$$ 当前进程的进程号 PID 脚本运行的当前 进程 ID 号
$? 显示最后命令的退出状态;0 表示没有错误,其他任何值表明有错误
$! 后台运行的最后一个进程的进程号 pid

**示例1**
[root@ ~]# vim test_var.sh
#!/bin/bash
echo "$* 一个字符串显示这个程序的所有参数"
echo "$# 表示这个程序的参数个数"
echo "$$ 表示当前进程的进程号 PID"
touch /tmp/b.txt &
echo "$! 表示上一个后台运行的进程的 PID"
echo "$? 表示上一个程序执行返回结果"
[root@ ~]# bash test_var.sh 1 2 3 4 5
1 2 3 4 5 表示这个程序的所有参数
5 表示这个程序的参数个数
22385 表示当前进程的进程号 PID
22387 表示上一个后台运行的进程的 PID
0 表示上一个程序执行返回结果

**示例2:常用的环境变量**
[root@ ~]# cd /opt
[root@ opt]# vim env.sh
#!/bin/bash
echo \$HOME 变量值是$HOME
echo \$PATH 变量值是$PATH
echo \$PWD 变量值是$PWD
[root@ opt]# bash env.sh 
$HOME 变量值是/root
$PATH 变量值是/opt/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
$PWD 变量值是/opt

命令的替换,使用$()或反引号

**例 1: 在命令中调用 date 命令输出值**
[root@ ~]# echo `date`
2018 年 05 月 25 日 星期五 17:41:29 CST
[root@ ~]# echo $(date)
2018 年 05 月 25 日 星期五 17:41:42 CST
[root@~]# echo `date +"%Y-%m-%d"`
2012-05-23
[root@ ~]# echo `date +%F`
2012-05-23
[root@ ~]# echo $(date +%F)
2012-05-23

shell中单引号和双引号的区别

‘’ 在单引号中所有的字符包括特殊字符(KaTeX parse error: Undefined control sequence: \) at position 7: ,'',`和\̲)̲都将解释成字符本身而成为普通字…, ‘’, `反引号和\以外所有的字符都解释成字符本身,拥有“调用变量的
值”、“引用命令”和“转义符”的特殊含义
注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不当
做是变量引用

**例 1:给变量值赋于多个单词,需要使用单引号和双引号**
[root@ ~]# var8='xuegod user1'
[root@ ~]# echo $var8
xuegdo user1

**例 2:赋值时单引号和双引号的区别**
[root@ ~]# var8='xuegod user1 $var1'
[root@ ~]# var9="xuegod user1 $var1" #双引中$符号有作用
[root@ ~]# echo $var8
xuegod user1 $var1
[root@ ~]# echo $var9
xuegod user1 123
注:单引号之间的内容原封不动赋值给变量, 双引号之间的内容如有特殊符号会保留它的特殊含义

**例 3:赋值时单引号和双引号的区别**
[root@ ~]# vim var.sh
#!/bin/bash
var=88
echo "$var"       当单独使用双引号时,可以取出变量值
echo '$var'        当单独使用单引号时,不能取出变量值
echo "'$var'"     当外层使用双引号时,输出内层的单引号和变量值
echo '"$var"'     当外层使用单引号时,输出内层的双引号和双引号中的内容。

**删除变量**
[root@ ~]# unset var1
[root@ ~]# echo $var1

设置PATH环境变量

SHELL 要执行某一个程序,它要在系统中去搜索这个程序的路径,PATH 变量是用来定义命令和查找命令的目录,当我们安装了第三方程序后,可以把第三方程序 bin 目录添加到这个 path 路径内,就可以在全局调用这个第三方程序了

**示例**
[root@ ~]# vim /opt/backup 
#!/bin/bash
echo "Backup data is OK!"
[root@ ~]# chmod +x /opt/backup 
[root@ ~]# /opt/backup
[root@ ~]# backup
bash: backup: 未找到命令...
将 backup 命令添加 PATH 中
[root@ ~]# echo $PATH
[root@ ~]# PATH=/opt/:$PATH
[root@ ~]# echo $PATH
[root@ ~]# backup #发现命令可以直接执行了,不用写全路径了
[root@ ~]# vim /etc/profile # 在文件最后追加以下内容,永久生效
export PATH=/opt/:$PATH
[root@ ~]# source /etc/profile #重新加载配置文件,使配置生效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值