1.shell概述
shell介于内核与用户之间,负责命令的解释,/bin/bash 是大多数Linux默认的shell,几乎包含了shell的所有功能。
shell脚本就是将需要执行的命令保存到文本中,按照顺序执行。它是解释型的,意味着不需要编译。
1)脚本第一行,#!指定解释器 #!/bin/bash 表示使用bash解释器解析
2)脚本第二部分,注释(#号)说明,对脚本的基本信息进行描述
3)脚本第三部分,脚本要实现的具体代码内容
#shell脚本的执行方式 [root@myhost shell01]# /shell01/first_shell.sh [root@myhost shell01]# ./first_shell.sh
双引号"" :会把引号的内容当成整体来看待,允许通过$符号引用其他变量值
单引号'' :会把引号的内容当成整体来看待,禁止引用其他变量值,shell中特殊符号都被视为普通字符
反撇号`` :反撇号和$()一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用
[root@myhost dir1]# echo "$(hostname)" myhost [root@myhost dir1]# echo '$(hostname)' $(hostname) [root@myhost dir1]# echo $(date +%Y) 2023 [root@myhost dir1]# echo `echo $(date +%Y)` 2023 [root@myhost dir1]# echo `date +%Y` 2023 [root@myhost dir1]# echo `echo `date +%Y`` date +%Y [root@myhost dir1]# echo $(echo `date +%Y`) 2023
-e 开启转义 \n:换行 \c:不换行
2.变量
定义规则
1.区分大小写
2.不能有特殊符号
3.不能以数字开头
4.等号两边不能有任何空格
定义方式
1.直接赋值
2.命令的执行结果赋值
3.交互是定义变量(read)
-p 定义提示用户的信息; -n 定义字符数;
-s 不显示内容 ; -t 定义超时时间;
4.定义有类型的变量
-i 将变量看成整数; -r 只读变量;
-a 普通数组; -A 关联数组; -x 将变量通过环境导出;
[root@myhost ~]# A=1234567 [root@myhost ~]# B=`date +%Y` [root@myhost ~]# read -p "Input your name:" name [root@myhost ~]# declare -i A=123
变量分类
本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
环境变量:当前进程有效,并且能够被子进程调用。
全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用。
系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用。
$? 上一条命令执行后返回的状态;0表示正常;
$0 当前执行的程序或脚本名;
$# 脚本参数的个数;
$* 脚本的所有参数,作为一个整体输出;
$@ 脚本的所有参数,相互独立输出;
$1~$9 / ${10}~${n} 脚本后面的位置参数;
$$ 当前进程的进程号
3.简单的四则运算
运算表达式: $(( )) $[ ] expr let
echo $((1+2)) echo $[3-1] expr 10/5 let n+=1 等价于 let n=n+1
4.数组
普通数组:只能使用整数作为数组索引(元素的下标)
一次赋予一个值:array[0]=v1 array[1]=v2
一次赋予多个值:array=(v1 v2 v3)
array1=(`cat /etc/passwd`) #将文件中每一行赋值给array1数组 array2=(`ls /home/tom`) array3=(harry amy jack "jerry") array4=(1 2 3 4 "hello world" [10]=linux)
数组的读取:
${array[0]} 获取数组里第一个元素 ${array[*]} 获取数组里的所有元素 ${#array[*]} 获取数组里所有元素个数 ${!array[@]} 获取数组元素的索引下标 ${array[@]:1:2} 访问指定的元素;1代表从下标为1的元素开始获取;2代表获取后面几个元素
declare -a 查看普通数组信息;
关联数组:可以使用字符串作为数组索引(元素的下标)
关联数组定义时先声明再赋值
declare -A array1
一次赋一个值: array1[linux]=one
一次赋多个值:array2=([name1]=harry [name2]=jack [name3]=amy [name4]="jack")
declare -A 查看关联数组信息;
5.其他变量定义
取出一个目录下的目录和文件:dirname和basename
a=/root/Desktop/shell/mem. dirname $a # /root/Desktop/shell basename $a # mem.txt
变量内容的删除
一个“%”代表从右往左去掉一个/key/ 两个“%%”代表从右往左最大去掉/key/
一个“#”代表从左往右去掉一个/key/ 两个“##”代表从左往右最大去掉/key/
替换:/:替换一个 //:替换全部
echo ${a/str1/str2} echo ${a//str1/str2}