shell脚本的概述

    • shell简介

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

shell脚本的概述_第1张图片

shell就是人机交互的一个桥梁

shell的种类

[root@myhost ~]# cat /etc/shells

/bin/sh #是bash的一个快捷方式

/bin/bash #bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能

/sbin/nologin #表示非交互,不能登录操作系统

/bin/dash #小巧,高效,功能相比少一些

/bin/csh #具有C语言风格的一种shell,具有许多特性,但也有一些缺陷

/bin/tcsh #是csh的增强版,完全兼容csh

2.shell脚本

就是将需要执行的命令保存到文本中,按照顺序执行。它是解释型的,意味着不需要编译。

shell脚本的基本写法

1)脚本第一行,#!指定解释器

#!/bin/bash 表示使用bash解释器解析

注意:如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用: #!/bin/env 解释器

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

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

如:

#!/bin/env bash

# 以下内容是对脚本的基本信息的描述

# Name: 名字

# Desc:描述describe

# Path:存放路径

# Usage:用法

# Update:更新时间

#下面就是脚本的具体内容

commands

...

shell脚本的执行方法

标准脚本执行方法(建议)

1) 编写第一个shell脚本

[root@myhost 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@myhost shell01]# chmod +x first_shell.sh 

3) 标准方式执行脚本

[root@myhost shell01]# pwd 
/shell01 
[root@myhost shell01]# /shell01/first_shell.sh 绝对路径

或者

[root@myhost shell01]# ./first_shell.sh 相对路径

注意:标准执行方式脚本必须要有可执行权限。

非标准的执行方法(不建议)

1. 直接在命令行指定解释器执行

[root@myhost shell01]# bash first_shell.sh 
[root@myhost shell01]# sh first_shell.sh 

2. 使用 source 命令读取脚本文件,执行文件里的代码

[root@myhost shell01]# source first_shell.sh 

hello world

hello world

hello world

注:bash中的引号

双引号"" :会把引号的内容当成整体来看待,允许通过$符号引用其他变量值

单引号'' :会把引号的内容当成整体来看待,禁止引用其他变量值,shell中特殊符号都被视为普通字符

反撇号`` :反撇号和$()一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用

[root@myhost dir1]# echo "$(hostname)" 

myhost

[root@myhost dir1]# echo '$(hostname)' 

$(hostname)

[root@myhost dir1]# echo "hello world" 

hello world

[root@myhost dir1]# echo 'hello world' 

hello world

[root@myhost dir1]# echo $(date +%Y)

2018

[root@myhost dir1]# echo `date +%Y` 

2018

[root@myhost dir1]# echo `echo `date +%Y`` 

date +%Y

[root@myhost dir1]# echo `echo $(date +%Y)` 

2018

[root@myhost dir1]# echo $(echo `date +%Y`) 

2018

注:

echo -e "hello\nworld\c" # -e 开启转义 \n:换行 \c:不换

3.注释

会被解释器忽略

单行注释格式:

# 这是一个注释

多行注释格式:

:<

注释内容...

注释内容...

注释内容...

EOF

说明:EOF 也可以使用其他符号

4.变量

变量是用来临时保存数据的,该数据是可以变化的数据。

1.变量定义

变量名=变量值

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

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

[root@myhost ~]# A=hello 定义变量A 
[root@myhost ~]# echo $A 调用变量A

hello

[root@myhost ~]# echo ${A} 还可以这样调用 

hello

[root@myhost ~]# A=world 因为是变量所以可以变
[root@myhost ~]# echo $A 

world

[root@myhost ~]# unset A 删除变量 
[root@myhost ~]# echo $A

2.变量的定义规则

㈠变量名区分大小写

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

hello

[root@myhost ~]# echo $a 

world

㈡变量名不能有特殊符号

[root@myhost ~]# *A=hello 

-bash: *A=hello: command not found

[root@myhost ~]# ?A=hello 

-bash: ?A=hello: command not found

[root@myhost ~]# @A=hello 

-bash: @A=hello: command not found

特别说明:对于有空格的字符串给变量赋值时,要用引号引起来

[root@myhost ~]# A=hello world 

-bash: world: command not found

[root@myhost ~]# A="hello world" 
[root@myhost ~]# A='hello world' 

㈢变量名不能以数字开头

[root@myhost ~]# 1A=hello 

-bash: 1A=hello: command not found

[root@myhost ~]# A1=hello 

注意:不能以数字开头并不代表变量名中不能包含数字。

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

[root@myhost ~]# A =123 

-bash: A: command not found

[root@myhost ~]# A= 123 

-bash: 123: command not found

[root@myhost ~]# A = 123 

-bash: A: command not found

[root@myhost ~]# A=123 
[root@myhost ~]# echo $A 

123

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

3.变量的定义方式

㈠基本方式

直接赋值给一个变量

[root@myhost ~]# A=1234567 
[root@myhost ~]# echo $A 

1234567

[root@myhost ~]# echo ${A:2:4} 表示从A变量中第3个字符开始截取,截取4个字符 

3456

说明:

$变量名 和 ${变量名}的异同

相同点:都可以调用变量

不同点:${变量名}可以只截取变量的一部分,而$变量名不可以

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

[root@myhost ~]# B=`date +%Y` 
[root@myhost ~]# echo $B 

2019

[root@myhost ~]# C=$(hostname) 
[root@myhost ~]# echo $C 

myhost

㈢交互式定义变量(read)

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

语法:read [选项] 变量名

常见选项:

shell脚本的概述_第2张图片

举例说明:

用法1:用户自己定义变量值

[root@myhost ~]# read name 

harry

[root@myhost ~]# echo $name 

harry

[root@myhost ~]# read -p "Input your name:" name 

Input your name:tom

[root@myhost ~]# echo $name 

tom

用法2:变量值来自文件

[root@myhost ~]# cat 1.txt

abc

[root@myhost ~]# read c < 1.txt 
[root@myhost ~]# echo $c 

abc

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

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

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

常用选项:

shell脚本的概述_第3张图片

举例说明:

[root@myhost ~]# declare -i A=123 
[root@myhost ~]# echo $A 

123

[root@myhost ~]# A=hello 
[root@myhost ~]# echo $A 

0

[root@myhost ~]# declare -r B=hello 
[root@myhost ~]# echo $B 

hello

[root@myhost ~]# B=world 

-bash: B: readonly variable

[root@myhost ~]# unset B 

-bash: unset: B: cannot unset: readonly variable

4.变量的分类

㈠本地变量

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

㈡环境变量

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

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

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

export 变量名=变量值

或者

变量名=变量值;

export 变量名

[root@myhost ~]# export A=hello 临时将一个本地变量(临时变量)变成环境变量 
[root@myhost ~]# env|grep A 

A=hello

永久生效:

vi /etc/profile 或者 ~/.bash_profile 
export A=hello  
source .bash_profile

㈢全局变量

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

解读相关配置文件

shell脚本的概述_第4张图片

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

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

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

㈣系统变量

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

shell脚本的概述_第5张图片
#!/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@myhost ~]# bash 3.sh a b c 

a

b

c

======我是分割线=======

a b c

5.简单四则运算

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

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

1. 四则运算符号

shell脚本的概述_第6张图片

expr 符号两侧需要空格

expr \( 1 + 2 \) \* 3 小括号和乘号需要转义

2.i++和++i

对变量的值的影响

[root@myhost ~]# i=1 
[root@myhost ~]# let i++ 
[root@myhost ~]# echo $i 

2

[root@myhost ~]# j=1 
[root@myhost ~]# let ++j 
[root@myhost ~]# echo $j 

2

对表达式的值的影响

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

2

[root@myhost ~]# echo $j 

2

[root@myhost ~]# echo $x 

1

[root@myhost ~]# echo $y 

2

6.数组

㈠数组分类

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

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

㈡普通数组定义

一次赋予一个值

数组名[索引下标]=值

array[0]=v1 
array[1]=v2 
array[3]=v3 

一次赋予多个值

数组名=(值1 值2 值3 ...)

array=(var1 var2 var3 var4) 
array1=(`cat /etc/passwd`) 将文件中每一行赋值给array1数组 
array2=(`ls /home/tom`) 
array3=(harry amy jack "jerry") 
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@myhost ~]# declare -a

㈣关联数组定义

①首先声明关联数组

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]="jack") 

查看关联数组

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

获取关联数组值

# 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

7.其他变量定义

取出一个目录下的目录和文件: dirname 和 basename

# A=/root/Desktop/shell/mem.txt 
# echo $A 
/root/Desktop/shell/mem.txt 
# dirname $A 取出目录 
/root/Desktop/shell 
# basename $A 取出文件 
mem.txt

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

一个“%”代表从右往左去掉一个/key/

两个“%%”代表从右往左最大去掉/key/

一个“#”代表从左往右去掉一个/key/

两个“##”代表从左往右最大去掉/key/

举例说明:

# url=www.taobao.com 
# echo ${#url} 获取变量的长度 
# echo ${url#*.} 
# echo ${url##*.} 
# echo ${url%.*} 
# echo ${url%%.*} 

替换:/ 和 //

 echo ${url/ao/AO} 替换第一个
 echo ${url//ao/AO} 替换所有

替代:- 和 :- +和:+

${变量名-新的变量值} 或者 ${变量名=新的变量值}

变量没有被赋值:会使用“新的变量值“ 替代

变量有被赋值(包括空值):不会被替代

echo ${abc-123} 
abc=hello 
echo ${abc-444} 
echo $abc 
abc= 
echo ${abc-222} 

${变量名:-新的变量值} 或者 ${变量名:=新的变量值}

变量没有被赋值或者赋空值:会使用“新的变量值“ 替代

变量有被赋值:不会被替代

echo ${ABC:-123} 
ABC=HELLO 
echo ${ABC:-123} 
ABC= 
echo ${ABC:-123} 

${变量名+新的变量值}

变量没有被赋值:不会使用“新的变量值“ 替代

变量有被赋值或者赋空值:会被替代

[root@myhost ~]# echo ${abc+123} 
[root@myhost ~]# abc=hello 
[root@myhost ~]# echo ${abc+123} 

123

[root@myhost ~]# abc= 
[root@myhost ~]# echo ${abc+123} 

123

${变量名:+新的变量值}

变量没有被赋值(包括空值):不会使用“新的变量值“ 替代

变量有被赋值:会被替代

[root@myhost ~]# echo ${abc:+123} 
[root@myhost ~]# abc=hello 
[root@myhost ~]# echo ${abc:+123} 

123

[root@myhost ~]# abc= 
[root@myhost ~]# echo ${abc:+123} 

${变量名?新的变量值}

变量没有被赋值:提示信息

变量被赋值(包括空值):不会使用“新的变量值“ 替代

[root@myhost ~]# echo ${abc?123} 

-bash: abc: 123

[root@myhost ~]# abc=hello 
[root@myhost ~]# echo ${abc?123} 

hello

[root@myhost ~]# abc= 
[root@myhost ~]# echo ${abc?123} 

你可能感兴趣的:(Linux,linux)