一、SHELL介绍

㈠ 什么是shell脚本?

简单来说就是将需要执行的命令保存到文本中,按照顺序执行。它是解释型的,意味着不需要编译。
若干命令 + 脚本的基本格式 + 脚本特定语法 + 思想= shell脚本

㈡ 什么时候用到脚本?

重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。

㈢ shell脚本能干啥?

①自动化软件部署	LAMP/LNMP/Tomcat...
②自动化管理 系统初始化脚本、批量更改主机密码、推送公钥...
③自动化分析处理 统计网站访问量
④自动化备份 数据库备份、日志转储...
⑤自动化监控脚本

㈣ 如何学习shell脚本?

尽可能记忆更多的命令(记忆命令使用功能和场景)
掌握脚本的标准的格式(指定魔法字节、使用标准的执行方式运行脚本)
必须==熟悉掌握==脚本的基本语法(重点)

㈤ 学习shell脚本的秘诀

多看(看懂)——>模仿(多练)——>多思考(多写)

㈥ shell脚本的基本写法

  1. 脚本第一行
魔法字符==#!==指定解释器【必写】
#!/bin/bash 表示以下内容使用bash解释器解析
注意: 如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用:#!/bin/env 解释器 #!/bin/env bash

2)脚本第二部分,注释(#号)说明,对脚本的基本信息进行描述【可选】

#!/bin/env bash
# 以下内容是对脚本的基本信息的描述
# Name: 名字
# Desc:描述describe
# Path:存放路径
# Usage:用法
# Update:更新时间 #下面就是脚本的具体内容
commands
...

3)脚本第三部分,脚本要实现的具体代码内容

㈦ shell脚本的执行方法

1) 编写人生第一个shell脚本
[root@mpd]# 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@mpd]# chmod +x first_shell.sh 3) 标准方式执行脚本
[root@mpd]# pwd
/shell01
[root@mpd]# /shell01/first_shell.sh
或者
[root@mpd]# ./first_shell.sh 注意:标准执行方式脚本必须要有可执行权限。 1. 直接俄在命令行指定解释器执行
[root@mpd]# bash first_shell.sh
[root@mpd]# sh first_shell.sh
[root@mpd]# bash -x first_shell.sh
+ echo 'hello world'
hello world
+ echo 'hello world'
hello world
+ echo 'hello world'
hello world
----------------
-x:一般用于排错,查看脚本的执行过程
-n:用来查看脚本的语法是否有问题
------------ 2. 使用source命令读取脚本文件,执行文件里的代码
[root@mpd]# source first_shell.sh
hello world
hello world
hello world

二、变量的定义

  1. 变量是什么?

一句话概括:变量是用来临时保存数据的,该数据是可以变化的数据。

  1. 什么时候需要定义变量?

如果某个内容需要多次使用,并且在代码中重复出现,那么可以用变量代表该内容。这样在修改内容的时候,仅仅需要修改变量的值。

在代码运作的过程中,可能会把某些命令的执行结果保存起来,后续代码需要使用这些结果,就可以直接使用这个变量。

  1. 变量如何定义?

*变量名=====变量值*

变量名:用来临时保存数据的

变量值:就是临时的可变化的数据

[root@mpd~]# A=hello			定义变量A
[root@mpd~]# echo $A 调用变量A,要给钱的,不是人民币是美元"$"
hello
[root@mpd~]# echo ${A} 还可以这样调用,不管你的姿势多优雅,总之要给钱
hello
[root@mpd~]# A=world 因为是变量所以可以变,移情别恋是常事
[root@mpd~]# echo $A 不管你是谁,只要调用就要给钱
world
[root@mpd~]# unset A 不跟你玩了,取消变量
[root@mpd~]# echo $A 从此,我单身了,你可以给我介绍任何人
  1. 变量的定义规则

虽然可以给变量(变量名)赋予任何值;但是,对于变量名也是要求的!

㈠ 变量名区分大小写

[root@mpd~]# A=hello
[root@mpd~]# a=world
[root@mpd~]# echo $A
hello
[root@mpd~]# echo $a
world

㈡ 变量名不能有特殊符号

[root@mpd~]# *A=hello
-bash: *A=hello: command not found
[root@mpd~]# ?A=hello
-bash: ?A=hello: command not found
[root@mpd~]# @A=hello
-bash: @A=hello: command not found 特别说明:对于有空格的字符串给变量赋值时,要用引号引起来
[root@MissHou ~]# A=hello world
-bash: world: command not found
[root@MissHou ~]# A="hello world"
[root

㈢ 变量名不能以数字开头

[root@mpd~]# 1A=hello
-bash: 1A=hello: command not found
[root@mpd~]# A1=hello
注意:不能以数字开头并不代表变量名中不能包含数字呦

㈣ 等号两边不能有任何空格

[root@mpd~]# A =123
-bash: A: command not found
[root@mpd~]# A= 123
-bash: 123: command not found
[root@mpd~]# A = 123
-bash: A: command not found
[root@mpd~]# A=123
[root@mpd~]# echo $A
123

㈤ 变量名尽量做到见名知意

NTP_IP=10.1.1.1
DIR=/u01/app1
TMP_FILE=/var/log/1.log
...
说明:一般变量名使用大写(小写也可以),不要同一个脚本中变量全是a,b,c等不容易阅读
  1. 变量的定义方式有哪些?

    ㈠ 基本方式
# 直接赋值给一个变量
[root@mpd~]# A=1234567
[root@mpd~]# echo $A
1234567
[root@mpd~]# echo ${A:2:4} 表示从A变量中第3个字符开始截取,截取4个字符
3456 说明:
$变量名 和 ${变量名}的异同
相同点:都可以调用变量
不同点:${变量名}可以只截取变量的一部分,而$变量名不可以

㈡ 命令执行结果赋值给变量

[root@mpd~]# B=`date +%F`
[root@mpd~]# echo $B
2019-04-16
[root@mpd~]# C=$(uname -r)
[root@mpd~]# echo $C
2.6.32-696.el6.x86_64

㈢ 交互式定义变量(read)

目的:让用户自己给变量赋值,比较灵活。

语法:read [选项] 变量名

常见选项

选项	# 释义
-p # 定义提示用户的信息
-n # 定义字符数(限制变量值的长度)
-s # 不显示(不显示用户输入的内容)
-t # 定义超时时间,默认单位为秒(限制用户输入变量值的超时时间
用法1:用户自己定义变量值
# 实例
[root@mpd~]# read name
harry
[root@mpd~]# echo $name
harry
[root@mpd~]# read -p "Input your name:" name
Input your name:tom
[root@mpd~]# echo $name
tom # 用法2:变量值来自文件
[root@mpd~]# cat 1.txt
10.1.1.1 255.255.255.0 [root@mpd~]# read ip mask < 1.txt
[root@mpd~]# echo $ip
10.1.1.1
[root@mpd~]# echo $mask
255.255.255.0

㈣ 定义有类型的变量(declare)

目的: 给变量做一些限制,固定变量的类型,比如:整型、只读

用法:declare 选项 变量名=变量值

常用选项:


选项 释义 举例
-i 将变量看成整数 declare -i A=123
-r 定义只读变量 declare -r B=hello
-a 定义普通数组;查看普通数组
-A 定义关联数组;查看关联数组
-x 将变量通过环境导出 declare -x AAA=123456 等于 export AAA=123456
[root@mpd~]# declare -i A=123
[root@mpd~]# echo $A
123
[root@mpd~]# A=hello
[root@mpd~]# echo $A
0 [root@mpd~]# declare -r B=hello
[root@mpd~]# echo $B
hello
[root@mpd~]# B=world
-bash: B: readonly variable
[root@mpd~]# unset B
-bash: unset: B: cannot unset: readonly variable
  1. 变量的分类

    ㈠ 本地变量

    本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。

    ㈡ 环境变量

    环境变量:当前进程有效,并且能够被子进程调用。

    env查看当前用户的环境变量

    set查询当前用户的所有变量(临时变量与环境变量)

    export 变量名=变量值 或者 变量名=变量值;export 变量
[root@mpd~]# export A=hello		临时将一个本地变量(临时变量)变成环境变量
[root@mpd~]# env|grep ^A
A=hello 永久生效:
vim /etc/profile 或者 ~/.bashrc
export A=hello
或者
A=hello
export A 说明:系统中有一个变量PATH,环境变量
export PATH=/usr/local/mysql/bin:$PATH

㈢ 全局变量

全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用.

解读相关配置文件


文件名 说明 备注
$HOME/.bashrc 当前用户的bash信息,用户登录时读取 定义别名、umask、函数等
$HOME/.bash_profile 当前用户的环境变量,用户登录时读取
$HOME/.bash_logout 当前用户退出当前shell时最后读取 定义用户退出时执行的程序等
/etc/bashrc 全局的bash信息,所有用户都生效
/etc/profile 全局环境变量信息 系统和所有用户都生效
$HOME/.bash_history 用户的历史命令 history -w 保存历史记录 history -c 清空历史记录

说明:以上文件修改后,都需要重新source让其生效或者退出重新登录。

用户登录系统读取相关文件的顺序

1 /etc/profile
2 $HOME/.bash_profile
3 $HOME/.bashrc
4 /etc/bashrc
5 $HOME/.bash_logout

㈣ 系统变量

系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用.

内置变量 含义

$? 上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误

$0 当前执行的程序或脚本名

$# 脚本后面接的参数的个数

$* 脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开

$@ 脚本后面所有参数,参数是独立的,也是全部输出

$1~$9 脚本后面的位置参数,$1表示第1个位置参数,依次类推

${10}~${n} 扩展位置参数,第10个位置变量必须用{}大括号括起来(2位数字以上扩起来)

$$ 当前所在进程的进程号,如echo $$

$! 后台运行的最后一个进程号 (当前终端)

!$ 调用最后一条命令历史中的参数

进一步了解位置参数$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

三、简单四则运算

算术运算:默认情况下,shell就只能支持简单的整数运算

运算内容:加(+)、减(-)、乘(*)、除(/)、求余数(%)

  1. 四则运算符号

表达式 举例
$(( )) echo $((1+1))
$[ ] echo $[10-5]
expr expr 10 / 5
let n=1;let n+=1 等价于 let n=n+1

2.了解i和i

对变量的值的影响

[root@mpd~]# i=1
[root@mpd~]# let i++
[root@mpd~]# echo $i
2
[root@mpd~]# j=1
[root@mpd~]# let ++j
[root@mpd~]# echo $j
2

对表达式的值的影响

[root@mpd~]# unset i j
[root@mpd~]# i=1;j=1
[root@mpd~]# let x=i++ 先赋值,再运算
[root@mpd~]# let y=++j 先运算,再赋值
[root@mpd~]# echo $i
2
[root@mpd~]# echo $j
2
[root@mpd~]# echo $x
1
[root@mpd~]# echo $y
2

四、扩展补充

  1. 数组定义

    ㈠ 数组分类

    普通数组:只能使用整数作为数组索引(元素的下标)

    关联数组:可以使用字符串作为数组索引(元素的下标)

    ㈡ 普通数组定义

    一次赋予一个值
数组名[索引下标]=值
array[0]=v1
array[1]=v2
array[2]=v3
array[3]=v4

一次赋予多个值

数组名=(值1 值2 值3 ...)
array=(var1 var2 var3 var4) array1=(`cat /etc/passwd`) 将文件中每一行赋值给array1数组
array2=(`ls /root`)
array3=(harry amy jack "Miss Hou")
array4=(1 2 3 4 "hello world" [10]=linux)

㈢ 数组的读取

${数组名[元素下标]}

echo ${array[0]}			获取数组里第一个元素
echo ${array[*]} 获取数组里的所有元素
echo ${#array[*]} 获取数组里所有元素个数
echo ${!array[@]} 获取数组元素的索引下标
echo ${array[@]:1:2} 访问指定的元素;1代表从下标为1的元素开始获取;2代表获取后面几个元素 查看普通数组信息:
[root@mpd~]# declare -a

㈣ 关联数组定义

①首先声明关联数组

declare -A asso_array1

declare -A asso_array1
declare -A asso_array2
declare -A asso_array3

② 数组赋值

一次赋一个值

数组名[索引or下标]=变量值
# asso_array1[linux]=one
# asso_array1[java]=two
# asso_array1[php]=three

一次赋多个值

asso_array2=([name1]=harry [name2]=jack [name3]=amy [name4]="mpd")

查看关联数组

# declare -A
declare -A asso_array1='([php]="three" [java]="two" [linux]="one" )'
declare -A asso_array2='([name3]="amy" [name2]="jack" [name1]="harry" [name4]="mpd" )'

获取关联数组值

# echo ${asso_array1[linux]}
one
# echo ${asso_array1[php]}
three
# echo ${asso_array1[*]}
three two one
# echo ${!asso_array1[*]}
php java linux
# echo ${#asso_array1[*]}
3
# echo ${#asso_array2[*]}
4
# echo ${!asso_array2[*]}
name3 name2 name1 name4

其他定义方式

[root@Mmpd]# declare -A books
[root@mpd5]# let books[linux]++
[root@mpd]# declare -A|grep books
declare -A books='([linux]="1" )'
[root@mpd]# let books[linux]++
[root@mpd]# declare -A|grep books
declare -A books='([linux]="2" )
  1. 其他变量定义

    取出一个目录下的目录和文件:dirname和 basename
# A=/root/Desktop/shell/mem.txt
# echo $A
/root/Desktop/shell/mem.txt
# dirname $A 取出目录
/root/Desktop/shell
# basename $A 取出文件
mem.tx

-变量"内容"的删除和替换

一个“%”代表从右往左删除
两个“%%”代表从右往左去掉最多
一个“#”代表从左往右去掉删除
两个“##”代表从左往右去掉最多 举例说明:
# url=www.taobao.com
# echo ${#url} 获取变量的长度
# echo ${url#*.}
# echo ${url##*.}
# echo ${url%.*}
# echo ${url%%.*}

以下了解,自己完成

# A=/root/Desktop/shell/mem.txt
# echo $A
/root/Desktop/shell/mem.txt
# dirname $A 取出目录
/root/Desktop/shell
# basename $A 取出文件
mem.txt
-变量"内容"的删除和替换
一个“%”代表从右往左删除
两个“%%”代表从右往左去掉最多
一个“#”代表从左往右去掉删除
两个“##”代表从左往右去掉最多 举例说明:
# url=www.taobao.com
# echo ${#url} 获取变量的长度
# echo ${url#*.}
# echo ${url##*.}
# echo ${url%.*}
# echo ${url%%.*}
以下了解,自己完成
替换:/ 和 //
1015 echo ${url/ao/AO} 用AO代替ao(从左往右第一个)
1017 echo ${url//ao/AO} 贪婪替换(替代所有) 替代: - 和 :- +和:+
1019 echo ${abc-123}
1020 abc=hello
1021 echo ${abc-444}
1022 echo $abc
1024 abc=
1025 echo ${abc-222} ${变量名-新的变量值} 或者 ${变量名=新的变量值}
变量没有被赋值:会使用“新的变量值“ 替代
变量有被赋值(包括空值): 不会被替代 1062 echo ${ABC:-123}
1063 ABC=HELLO
1064 echo ${ABC:-123}
1065 ABC=
1066 echo ${ABC:-123} ${变量名:-新的变量值} 或者 ${变量名:=新的变量值}
变量没有被赋值或者赋空值:会使用“新的变量值“ 替代
变量有被赋值: 不会被替代 1116 echo ${abc=123}
1118 echo ${abc:=123} [root@mpd~]# unset abc
[root@mpd~]# echo ${abc:+123} [root@mpd~]# abc=hello
[root@mpd~]# echo ${abc:+123}
123
[root@mpd~]# abc=
[root@mpd~]# echo ${abc:+123} ${变量名+新的变量值}
变量没有被赋值或者赋空值:不会使用“新的变量值“ 替代
变量有被赋值: 会被替代
[root@mpd~]# unset abc
[root@mpd~]# echo ${abc+123} [root@mpd~]# abc=hello
[root@mpd~]# echo ${abc+123}
123
[root@mpd~]# abc=
[root@mpd~]# echo ${abc+123}
123
${变量名:+新的变量值}
变量没有被赋值:不会使用“新的变量值“ 替代
变量有被赋值(包括空值): 会被替代 [root@mpd~]# unset abc
[root@mpd~]# echo ${abc?123}
-bash: abc: 123 [root@mpd~]# abc=hello
[root@mpd~]# echo ${abc?123}
hello
[root@mpd~]# abc=
[root@mpd~]# echo ${abc?123} ${变量名?新的变量值}
变量没有被赋值:提示错误信息
变量被赋值(包括空值):不会使用“新的变量值“ 替代 [root@mpd~]# unset abc
[root@mpd~]# echo ${abc:?123}
-bash: abc: 123
[root@mpd~]# abc=hello
[root@mpd~]# echo ${abc:?123}
hello
[root@mpd~]# abc=
[root@mpd~]# echo ${abc:?123}
-bash: abc: 123 ${变量名:?新的变量值}
变量没有被赋值或者赋空值时:提示错误信息
变量被赋值:不会使用“新的变量值“ 替代 说明:?主要是当变量没有赋值提示错误信息的,没有赋值功能

01 shell编程之变量定义的更多相关文章

  1. Linux学习——shell编程之变量

    shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...

  2. 01 shell编程规范与变量

    前言: 大家对shell脚本应该都不算陌生了,如果突然问你什么是shell脚本?是干什么用的?由什么组成以及怎么使用?变量的概念是什么?作用范围是什么?变量间的算术运算怎么表示?你能很容易答出来吗 本 ...

  3. Linux —— Shell编程之变量赋值和引用

    Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量.有三种主要的变量类型:环境变量.内部变量和用户变量. 环境变量(environment variable)是系统环境的一部分, ...

  4. Linux编程 21 shell编程(环境变量,用户变量,命令替换)

    一.概述 这篇介绍shell的变量使用,跟其实语言一样,都有声明变量,使用变量,在shell中变量允许你临时地将信息存储中shell脚本中,以便和脚本的其他命令一起使用. 1.1 环境变量 在前面章节 ...

  5. Shell编程-02-Shell变量

    目录 什么是Shell变量 变量类型 环境变量初始化及其对应文件的生效顺序 什么是Shell变量     在初等数学数学方程式中,我们会经常碰到类似于这样的方程式:y=x+1 ,等号左右两边的x和y称 ...

  6. Linux Shell编程、变量、控制语句

    为什么要学习Shell编程 1)Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理. 2)对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些 ...

  7. linux shell编程之变量和bash配置文件(第一篇)

    编程语言有两类 强类型:如C语言.数据具有其特定的类型,先声明定义后才能使用.数据运算时必须符合类型要求(如不能把字符串类型数据直接与整型数据做算数运算) 弱类型:如shell.数据默认为字符型,不用 ...

  8. SHELL编程概念&变量剖析

    一.shell软件概念和应用场景 1) 学习Linux技术,不是为了学习系统安装.命令操作.用户权限.配置IP.网络管理,学习Linux技术重点:基于Linux系统部署和维护各种应用软件.程序(Apa ...

  9. Linux - 简明Shell编程02 - 变量(Variable)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash v1=test-variabl ...

随机推荐

  1. JavaWeb网上图书商城完整项目--25.注册页面之隐藏没有内容的错误信息实现

    在上一章中我们显示的效果如下所示: 上面后面都有错误的红色×的显示,这样是不对的,我们要解决该问题 我们要循环遍历每一个错误的信息,看它的内容有没有,如果有内容我们就显示错误的×,如果没有就不显示× ...

  2. 网络虚拟化之linux虚拟网络基础

    1 linux虚拟网络基础 1.1 Device 在linux里面devic(设备)与传统网络概念里的物理设备(如交换机.路由器)不同,Linux所说的设备,其背后指的是一个类似于数据结构.内核模块或 ...

  3. Spring系列.SpEL表达式

    Spring表达式语言 SpEL语言是一种强大的表达式语言,支持在运行时查询和操作对象.SpEL表达式不一定要创建IOC容器后才能使用.用户完全可以单独调用SpEL的API来独立的使用时SpEL表达式 ...

  4. druid18.1版本sing-server启动报错

    正文 昨天下载了一个18版本的driud打算在虚拟机探究一下,然后按照官网的启动方式启动了,每个失败.官网是/bin/start-micro-quickstart,我们去看他的单机启动配置 http: ...

  5. git常用命令(部分)

    git常用命令 1.git init 初始化一个新本地仓库,它在工作目录下生成一个名为.git的隐藏文件夹. 安装好git的,新建一个文件夹,在空文件夹中鼠标右击点击Git Bash Here 2.g ...

  6. python基础知识扩展(一)

    python课外笔记 1.print函数 print("helloworld")其实系统默认隐藏了一个参数end,完整的print()语句是 print("hellowo ...

  7. linux就该这么学 第一天学习笔记

    题外话 在每天的网上冲浪中,一次无意间的点击,发现了linux就该这么学的网站,然后就看了一晚上,当时还是学生的我特别想要参加培训,可是碍于眼前的经济状况,只得将这个想法深深的藏在了心里,并加了一下网 ...

  8. IntelliJ IDEA快速实现Docker镜像部署

    一.Docker开启远程访问 [root@izwz9eftauv7x69f5jvi96z docker]# vim /usr/lib/systemd/system/docker.service #修改 ...

  9. centos7时间调整

    查看时区是否正确,命令date -R: 不正确先调整时区,命令tzselect: 安装ntp,命令yum install ntp: 同步时间,命令ntpdate cn.pool.ntp.org: 设置 ...

  10. Write a program to copy its input to its output, replacing each tab by \t, each backspace by \b, and each backslash by \\. This makes tabs and backspa

    #include <stdio.h> #define DBS '\\' void main() { int c; while((c=getchar())!=EOF) { if(c=='\t ...