Shell的基本语法结构
一、SHELL介绍
前言:
计算机只能认识(识别)机器语言(0和1),如(11000000 这种)。但是,我们的程序猿们不能直接去写01这样的代码,所以,要想将程序猿所开发的代码在计算机上运行,就必须找"人"(工具)来翻译成机器语言,这个"人"(工具)就是我们常常所说的 编译器或者解释器
。
1. 编程语言分类
编译型语言:
程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++
解释型语言:
程序不需要编译,程序在运行时由解释器翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/JavaScript/ Perl /ruby/Shell等都是解释型语言。
总结
编译型语言比解释型语言速度较快,但是不如解释型语言跨平台性好
。如果做底层开发或者大型应用程序或者操作系开发一般都用编译型语言
;如果是一些服务器脚本及一些辅助的接口,对速度要求不高、对各个平台的兼容性有要求的话则一般都用解释型语言
。
2. shell简介
shell的种类
[root@wolf ~]# cat /etc/shells
/bin/sh #是bash的一个快捷方式
/bin/bash #bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能
/sbin/nologin #表示非交互,不能登录操作系统
/bin/dash #小巧,高效,功能相比少一些
/bin/csh #具有C语言风格的一种shell,具有许多特性,但也有一些缺陷
/bin/tcsh #是csh的增强版,完全兼容csh
思考:终端和shell有什么关系
?
3. shell脚本
㈠ 什么是shell脚本?
简单来说就是将需要执行的命令保存到文本中,按照顺序执行。它是解释型的,意味着不需要编译。
若干命令 + 脚本的基本格式 + 脚本特定语法 + 思想= shell脚本
㈡ 什么时候用到脚本?
重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。
㈢ shell脚本能干啥?
①自动化软件部署 LAMP/LNMP/Tomcat…
②自动化管理 系统初始化脚本、批量更改主机密码、推送公钥
③自动化分析处理 统计网站访问量
④自动化备份 数据库备份、日志转储…
⑤自动化监控脚本
㈣shell脚本的基本写法
1)脚本第一行,魔法字符#!指定解释器【必写】
#!/bin/bash
表示以下内容使用bash解释器解析
注意: 如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用: #!/bin/env 解释器
2)脚本第二部分,注释(#号)说明,对脚本的基本信息进行描述【可选】
#!/bin/env bash
# 以下内容是对脚本的基本信息的描述
# Name: 名字
# Desc:描述describe
# Path:存放路径
# Usage:用法
# Update:更新时间
#下面就是脚本的具体内容
commands
...
3)脚本第三部分,脚本要实现的具体代码内容
㈤shell脚本的执行方法
- 标准脚本执行方法(建议)
1) 编写人生第一个shell脚本
[root@wolf shell01]# cat first_shell.sh
#!/bin/env bash
# 以下内容是对脚本的基本信息的描述
# Name: first_shell.sh
# Desc: num1
# Path: /shell01/first_shell.sh
# Usage:/shell01/first_shell.sh
# Update:2019-05-05
echo "hello world"
echo "hello world"
echo "hello world"
2) 脚本增加可执行权限
[root@wolf shell01]# chmod +x first_shell.sh
3) 标准方式执行脚本
[root@wolf shell01]# pwd
/shell01
[root@wolf shell01]# /shell01/first_shell.sh
或者
[root@wolf shell01]# ./first_shell.sh
注意:标准执行方式脚本必须要有可执行权限
- 非标准的执行方法(不建议)
- 直接在命令行指定解释器执行
[root@wolf shell01]# bash first_shell.sh
[root@wolf shell01]# sh first_shell.sh
[root@wolf shell01]# bash -x first_shell.sh
+ echo 'hello world'
hello world
+ echo 'hello world'
hello world
+ echo 'hello world'
hello world
-x:一般用于排错,查看脚本的执行过程
-n:用来查看脚本的语法是否有问题
- 使用 source 命令读取脚本文件,执行文件里的代码
[root@MissHou shell01]# source first_shell.sh
hello world
hello world
hello world
二、变量的定义
1. 变量是什么?
一句话概括:变量是用来临时保存数据的,该数据是可以变化的数据
。
2. 什么时候需要定义变量?
- 如果某个内容需要多次使用,并且在代码中重复出现,那么可以用变量代表该内容。这样在修改内容的时候,仅仅需要修改变量的值。
- 在代码运作的过程中,可能会把某些命令的执行结果保存起来,后续代码需要使用这些结果,就可以直接使用这个变量。
3.变量如何定义?
变量名=变量值
变量名:用来临时保存数据的
变量值:就是临时的可变化的数据
[root@wolf ~]# A=hello 定义变量A
[root@wolf ~]# echo $A 调用变量A,要给钱的,不是人民币是美元"$"
hello
[root@wolf ~]# echo ${A} 还可以这样调用,不管你的姿势多优雅,总之要给钱
hello
[root@wolf ~]# A=world 因为是变量所以可以变,移情别恋是常事
[root@wolf ~]# echo $A 不管你是谁,只要调用就要给钱
world
[root@wolf ~]# unset A 不跟你玩了,取消变量
[root@wolf ~]# echo $A 从此,我单身了,你可以给我介绍任何人
4. 变量的定义规则
虽然可以给变量(变量名)赋予任何值;但是,对于变量名也是要求的!😒
㈠ 变量名区分大小写
[root@wolf ~]# A=hello
[root@wolf ~]# a=world
[root@wolf ~]# echo $A
hello
[root@wolf ~]# echo $a
world
㈡ 变量名不能有特殊符号
[root@wolf ~]# *A=hello
-bash: *A=hello: command not found
[root@wolf ~]# ?A=hello
-bash: ?A=hello: command not found
[root@wolf ~]# @A=hello
-bash: @A=hello: command not found
特别说明:对于有空格的字符串给变量赋值时,要用引号引起来
[root@wolf ~]# A=hello world
-bash: world: command not found
[root@wolf ~]# A="hello world"
[root@wolf ~]# A='hello world'
㈢ 变量名不能以数字开头
[root@wolf ~]# 1A=hello
-bash: 1A=hello: command not found
[root@wolf ~]# A1=hello
注意:不能以数字开头并不代表变量名中不能包含数字呦。
㈣ 等号两边不能有任何空格
[root@wolf ~]# A =123
-bash: A: command not found
[root@wolf ~]# A= 123
-bash: 123: command not found
[root@wolf ~]# A = 123
-bash: A: command not found
[root@wolf ~]# A=123
[root@wolf ~]# echo $A
123
㈤ 变量名尽量做到见名知意
NTP_IP=10.1.1.1
DIR=/u01/app1
TMP_FILE=/var/log/1.log
...
说明:一般变量名使用大写(小写也可以),不要同一个脚本中变量全是a,b,c等不容易阅读
5. 变量的定义方式有哪些?
㈠ 基本方式
直接赋值给一个变量
[root@wolf ~]# A=1234567
[root@wolf ~]# echo $A
1234567
[root@wolf ~]# echo ${A:2:4} 表示从A变量中第3个字符开始截取,截取4个字符
3456
说明:
$变量名 和 ${变量名}的异同
相同点:都可以调用变量
不同点:${变量名}可以只截取变量的一部分,而$变量名不可以
㈡ 命令执行结果赋值给变量
[root@wolf ~]# B=`date +%F`
[root@wolf ~]# echo $B
2019-04-16
[root@wolf ~]# C=$(uname -r)
[root@wolf ~]# echo $C
2.6.32-696.el6.x86_64
㈢ 交互式定义变量(read)
目的:让用户自己给变量赋值,比较灵活。
语法:
read [选项] 变量名
常见选项:
举例说明:
用法1:用户自己定义变量值
[root@wolf ~]# read name
harry
[root@wolf ~]# echo $name
harry
[root@wolf ~]# read -p "Input your name:" name
Input your name:tom
[root@wolf ~]# echo $name
tom
用法2:变量值来自文件
[root@wolf ~]# cat 1.txt
10.1.1.1 255.255.255.0
[root@wolf ~]# read ip mask < 1.txt
[root@wolf ~]# echo $ip
10.1.1.1
[root@wolf ~]# echo $mask
255.255.255.0
㈣ 定义有类型的变量(declare)
目的:给变量做一些限制,固定变量的类型,比如:整型、只读
用法:
declare 选项 变量名=变量值
常用选项:
举例说明:
[root@wolf ~]# declare -i A=123
[root@wolf ~]# echo $A
123
[root@wolf ~]# A=hello
[root@wolf ~]# echo $A
0
[root@wolf ~]# declare -r B=hello
[root@wolf ~]# echo $B
hello
[root@wolf ~]# B=world
-bash: B: readonly variable
[root@wolf ~]# unset B
-bash: unset: B: cannot unset: readonly variable
6. 变量的分类
㈠ 本地变量
本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效
。
㈡ 环境变量
环境变量:当前进程有效,并且能够被子进程调用
。
- env 查看当前用户的环境变量
- set 查询当前用户的所有变量(临时变量与环境变量)
- export 变量名=变量值 或者 变量名=变量值;export 变量名
[root@wolf ~]# export A=hello 临时将一个本地变量(临时变量)变成环境变量
[root@wolf ~]# env|grep ^A
A=hello
永久生效:
vim /etc/profile 或者 ~/.bashrc
export A=hello
或者
A=hello
export A
说明:系统中有一个变量PATH,环境变量
export PATH=/usr/local/mysql/bin:$PATH
㈢ 全局变量
全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用.
解读相关配置文件
说明:以上文件修改后,都需要重新source让其生效或者退出重新登录
用户登录系统读取相关文件的顺序
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bashrc
- /etc/bashrc
- $HOME/.bash_logout
㈣ 系统变量
系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用
进一步了解位置参数 $ 1~$ {n}
#!/bin/bash
#了解shell内置变量中的位置参数含义
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$11 = ${11}"
echo "\$12 = ${12}"
进一步了解$ *和$ @的区
别
$* :表示将变量看成一个整体 ; $@ :表示变量是独立的
:
#!/bin/bash
for i in "$@"
do
echo $i
done
echo "======我是分割线======="
for i in "$*"
do
echo $i
done
[root@MissHou ~]# bash 3.sh a b c
a b c =
=====我是分割线=======
a b c
转载:https://blog.csdn.net/wolfGuiDao/article/details/105694828