Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
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
就是将需要执行的命令保存到文本中,按照顺序执行。它是解释型的,意味着不需要编译。
1)脚本第一行,#!指定解释器
#!/bin/bash 表示使用bash解释器解析
注意:如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用: #!/bin/env 解释器
2)脚本第二部分,注释(#号)说明,对脚本的基本信息进行描述【可选】
3)脚本第三部分,脚本要实现的具体代码内容
如:
#!/bin/env bash
# 以下内容是对脚本的基本信息的描述
# Name: 名字
# Desc:描述describe
# Path:存放路径
# Usage:用法
# Update:更新时间
#下面就是脚本的具体内容
commands
...
标准脚本执行方法(建议)
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:不换
会被解释器忽略
单行注释格式:
# 这是一个注释
多行注释格式:
:< 注释内容... 注释内容... 注释内容... EOF 说明:EOF 也可以使用其他符号 变量是用来临时保存数据的,该数据是可以变化的数据。 变量名=变量值 变量名:用来临时保存数据的 变量值:就是临时的可变化的数据 hello hello world ㈠变量名区分大小写 hello world ㈡变量名不能有特殊符号 -bash: *A=hello: command not found -bash: ?A=hello: command not found -bash: @A=hello: command not found 特别说明:对于有空格的字符串给变量赋值时,要用引号引起来 -bash: world: command not found ㈢变量名不能以数字开头 -bash: 1A=hello: command not found 注意:不能以数字开头并不代表变量名中不能包含数字。 ㈣等号两边不能有任何空格 -bash: A: command not found -bash: 123: command not found -bash: A: command not found 123 ㈤变量名尽量做到见名知意 ㈠基本方式 直接赋值给一个变量 1234567 3456 说明: $变量名 和 ${变量名}的异同 相同点:都可以调用变量 不同点:${变量名}可以只截取变量的一部分,而$变量名不可以 ㈡命令执行结果赋值给变量 2019 myhost ㈢交互式定义变量(read) 目的:让用户自己给变量赋值,比较灵活。 语法:read [选项] 变量名 常见选项: 举例说明: 用法1:用户自己定义变量值 harry harry Input your name:tom tom 用法2:变量值来自文件 abc abc ㈣定义有类型的变量(declare) 目的:给变量做一些限制,固定变量的类型,比如:整型、只读 用法:declare 选项 变量名=变量值 常用选项: 举例说明: 123 0 hello -bash: B: readonly variable -bash: unset: B: cannot unset: readonly variable ㈠本地变量 本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。 ㈡环境变量 环境变量:当前进程有效,并且能够被子进程调用。 env 查看当前用户的环境变量 set 查询当前用户的所有变量(临时变量与环境变量) export 变量名=变量值 或者 变量名=变量值; export 变量名 A=hello 永久生效: ㈢全局变量 全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用. 解读相关配置文件 说明:以上文件修改后,都需要重新source让其生效或者退出重新登录。 用户登录系统读取相关文件的顺序 ㈣系统变量 系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用. 进一步了解$*和$@的区别 $* :表示将变量看成一个整体 $@ :表示变量是独立的 a b c ======我是分割线======= a b c 算术运算:默认情况下,shell就只能支持简单的整数运算 运算内容:加(+)、减(-)、乘(*)、除(/)、求余数(%) 1. 四则运算符号 expr 符号两侧需要空格 expr \( 1 + 2 \) \* 3 小括号和乘号需要转义 2.i++和++i 对变量的值的影响 2 2 对表达式的值的影响 2 2 1 2 ㈠数组分类 普通数组:只能使用整数作为数组索引(元素的下标) 关联数组:可以使用字符串作为数组索引(元素的下标) ㈡普通数组定义 一次赋予一个值 数组名[索引下标]=值 一次赋予多个值 数组名=(值1 值2 值3 ...) ㈢数组的读取 ${数组名[元素下标]} echo ${array[0]} 获取数组里第一个元素 echo ${array[*]} 获取数组里的所有元素 echo ${#array[*]} 获取数组里所有元素个数 echo ${!array[@]} 获取数组元素的索引下标 echo ${array[@]:1:2} 访问指定的元素;1代表从下标为1的元素开始获取;2代表获取后面几个元素 @和*通用 查看普通数组信息: ㈣关联数组定义 ①首先声明关联数组 ② 数组赋值 一次赋一个值 数组名[索引or下标]=变量值 一次赋多个值 查看关联数组 获取关联数组值 one three three two one php java linux 3 4 name3 name2 name1 name4 取出一个目录下的目录和文件: dirname 和 basename 变量"内容"的删除和替换 一个“%”代表从右往左去掉一个/key/ 两个“%%”代表从右往左最大去掉/key/ 一个“#”代表从左往右去掉一个/key/ 两个“##”代表从左往右最大去掉/key/ 举例说明: 替换:/ 和 // 替代:- 和 :- +和:+ ${变量名-新的变量值} 或者 ${变量名=新的变量值} 变量没有被赋值:会使用“新的变量值“ 替代 变量有被赋值(包括空值):不会被替代 ${变量名:-新的变量值} 或者 ${变量名:=新的变量值} 变量没有被赋值或者赋空值:会使用“新的变量值“ 替代 变量有被赋值:不会被替代 ${变量名+新的变量值} 变量没有被赋值:不会使用“新的变量值“ 替代 变量有被赋值或者赋空值:会被替代 123 123 ${变量名:+新的变量值} 变量没有被赋值(包括空值):不会使用“新的变量值“ 替代 变量有被赋值:会被替代 123 ${变量名?新的变量值} 变量没有被赋值:提示信息 变量被赋值(包括空值):不会使用“新的变量值“ 替代 -bash: abc: 123 hello 4.变量
1.变量定义
[root@myhost ~]# A=hello 定义变量A
[root@myhost ~]# echo $A 调用变量A
[root@myhost ~]# echo ${A} 还可以这样调用
[root@myhost ~]# A=world 因为是变量所以可以变
[root@myhost ~]# echo $A
[root@myhost ~]# unset A 删除变量
[root@myhost ~]# echo $A
2.变量的定义规则
[root@myhost ~]# A=hello
[root@myhost ~]# a=world
[root@myhost ~]# echo $A
[root@myhost ~]# echo $a
[root@myhost ~]# *A=hello
[root@myhost ~]# ?A=hello
[root@myhost ~]# @A=hello
[root@myhost ~]# A=hello world
[root@myhost ~]# A="hello world"
[root@myhost ~]# A='hello world'
[root@myhost ~]# 1A=hello
[root@myhost ~]# A1=hello
[root@myhost ~]# A =123
[root@myhost ~]# A= 123
[root@myhost ~]# A = 123
[root@myhost ~]# A=123
[root@myhost ~]# echo $A
3.变量的定义方式
[root@myhost ~]# A=1234567
[root@myhost ~]# echo $A
[root@myhost ~]# echo ${A:2:4} 表示从A变量中第3个字符开始截取,截取4个字符
[root@myhost ~]# B=`date +%Y`
[root@myhost ~]# echo $B
[root@myhost ~]# C=$(hostname)
[root@myhost ~]# echo $C
[root@myhost ~]# read name
[root@myhost ~]# echo $name
[root@myhost ~]# read -p "Input your name:" name
[root@myhost ~]# echo $name
[root@myhost ~]# cat 1.txt
[root@myhost ~]# read c < 1.txt
[root@myhost ~]# echo $c
[root@myhost ~]# declare -i A=123
[root@myhost ~]# echo $A
[root@myhost ~]# A=hello
[root@myhost ~]# echo $A
[root@myhost ~]# declare -r B=hello
[root@myhost ~]# echo $B
[root@myhost ~]# B=world
[root@myhost ~]# unset B
4.变量的分类
[root@myhost ~]# export A=hello 临时将一个本地变量(临时变量)变成环境变量
[root@myhost ~]# env|grep A
vi /etc/profile 或者 ~/.bash_profile
export A=hello
source .bash_profile
1. /etc/profile
2. $HOME/.bash_profile
3. $HOME/.bashrc
4. /etc/bashrc
5. $HOME/.bash_logout
#!/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
5.简单四则运算
[root@myhost ~]# i=1
[root@myhost ~]# let i++
[root@myhost ~]# echo $i
[root@myhost ~]# j=1
[root@myhost ~]# let ++j
[root@myhost ~]# echo $j
[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
[root@myhost ~]# echo $j
[root@myhost ~]# echo $x
[root@myhost ~]# echo $y
6.数组
array[0]=v1
array[1]=v2
array[3]=v3
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)
[root@myhost ~]# declare -a
declare -A asso_array1
declare -A asso_array2
declare -A asso_array3
# 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]}
# echo ${asso_array1[php]}
# echo ${asso_array1[*]}
# echo ${!asso_array1[*]}
# echo ${#asso_array1[*]}
# echo ${#asso_array2[*]}
# echo ${!asso_array2[*]}
7.其他变量定义
# 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%%.*}
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}
[root@myhost ~]# abc=
[root@myhost ~]# echo ${abc+123}
[root@myhost ~]# echo ${abc:+123}
[root@myhost ~]# abc=hello
[root@myhost ~]# echo ${abc:+123}
[root@myhost ~]# abc=
[root@myhost ~]# echo ${abc:+123}
[root@myhost ~]# echo ${abc?123}
[root@myhost ~]# abc=hello
[root@myhost ~]# echo ${abc?123}
[root@myhost ~]# abc=
[root@myhost ~]# echo ${abc?123}