bash基本特性

发布时间 2023-05-23 14:53:18作者: 村尚chun叔

1、常见的快捷键

^c   			终止前台运行的程序
^z  			将前台运行的程序挂起到后台
^d   			退出 等价exit
^l   			清屏
^a |home  		光标移到命令行的最前端
^e |end  		光标移到命令行的后端
^u   			删除光标前所有字符
^k   			删除光标后所有字符
^r 			搜索历史命令

2、常用的通配符(重点)

*:匹配0或多个任意字符
?:匹配任意单个字符
[list]:匹配[list]中的任意单个字符
[!list]:匹配除list中的任意单个字符
{string1,string2,...}:匹配string1,string2或更多字符串

3、bash中的引号(重点)

双引号"":会把引号的内容当成整体来看待,允许通过$符号引用其他变量值
单引号'':会把引号的内容当成整体来看待,禁止引用其他变量值,shell中特殊符号都被视为普通字符
反撇号``:反撇号和$()一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用

4、变量的定义

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

/etc/profile->$HOME/.bash_profile->$HOME/.bashrc->/etc/bashrc->$HOME/.bash_logout

② 系统变量(内置bash中变量)

$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
若退出状态值为0,表示命令运行成功
若退出状态值为127,表示command not found
若退出状态值为126,表示找到了该命令但无法执行(权限不够)
若退出状态值为1&2,表示没有那个文件或目录

$$:当前所在进程的进程号     echo $$   eg:kill -9 `echo $$`  = exit   退出当前会话
$!:后台运行的最后一个进程号  (当前终端)  # gedit &
!$:调用最后一条命令历史中的参数
!!:调用最后一条命令历史
$#:脚本后面接的参数的个数
$*:脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@: 脚本后面所有参数,参数是独立的,也是全部输出
$0:当前执行的进程/程序名  echo $0
$1~$9 位置参数变量
${10}~${n} 扩展位置参数变量  第10个位置变量必须用{}大括号括起来
测试脚本
#!/bin/bash
#xxxx
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$11 = ${11}"
echo "\$12 = ${12}"

了解$*和$@的区别:
$*:表示将变量看成一个整体
$@:表示变量是独立的

③ 变量的定义规则

a、变量的定义
默认情况下,shell里定义的变量是不分类型的,可以给变量赋与任何类型的值;等号两边不能有空格,对于有空格的字符串做为赋值时,要用引号引起来
变量名=变量值
b、变量的获取方式
$a或${a}
echo ${a:2:3}:a表示变量名;2表示从第3个字符开始;3表示后面3个字符
如果获取变量的全部两个都可以;如果获取变量的某一部分,用${变量名}
c、取消变量
unset 变量名
d、变量名区分大小写,同名称但大小写不同的变量名是不同的变量
e、变量名可以是字母或数字或下划线,但是不能以数字开头或者特殊字符
f、命令的执行结果可以保存到变量
# kernel=`uname -r`
# echo $kernel
g、有类型变量 declare
-i 将变量看成整数

declare -i a=2
declare -i b=4
declare -i c=$a+$b
echo $c

-r 使变量只读 readonly
-x 标记变量通过环境导出 export

declare -x BBBB=hello
env|grep BBBB

-a 指定为索引数组(普通数组);查看普通数组
-A 指定为关联数组;查看关联数组
h、数组
普通数组:只能使用整数作为数组索引(元素的下标)
关联数组:可以使用字符串作为数组索引(元素的下标)
普通数组定义:用括号来表示数组,数组元素(变量)用“空格”符号分割开。定义数组的一般形式为:
一次赋一个值:
变量名=变量值

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

一次赋多个值:

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)

读取数组:
${array[i]} i表示元素的下标

echo ${array[0]}	获取第一个元素
echo ${array[*]}	获取数组里的所有元素
echo ${#array[*]}	获取数组里所有元素个数
echo ${!array[@]}	获取数组元素的索引下标
echo ${array[@]:1:2}	访问指定的元素;1代表从下标为1的元素开始获取;2代表获取后面几个元素

查看普通数组信息:

declare -a
declare -a array='([0]="var1" [1]="var2" [2]="var3")'
declare -a array1='([0]="uu1" [1]="uu2" [2]="uu3" [3]="uu4")'
declare -a array2='([0]="1.sh" [1]="2.sh" [2]="3.sh" [3]="4.sh" [4]="passwd")'
declare -a array3='([0]="jack" [1]="harry" [2]="Miss Hou" [5]="tom")'

关联数组定义:
首先声明关联数组

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

查看关联数组:

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

i、交互式定义变量的值 read,主要用于让用户去定义变量值
-p 提示信息
-n 字符数 (限制变量值的字符数)
-s 不显示
-t 超时(默认单位秒)(限制用户输入变量值的超时时间)

cat 1.txt
10.1.1.1 255.255.255.0
read -p "Input your IP and Netmask:" ip mask < 1.txt
echo $ip
10.1.1.1
echo $mask
255.255.255.0

j、其他变量(扩展)
1)取出一个目录下的目录和文件:dirname和 basename

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

2)变量"内容"的删除和替换
一个“%”代表从右往左去掉一个/key/
两个“%%”代表从右往左最大去掉/key/
一个“#”代表从左往右去掉一个/key/
两个“##”代表从左往右最大去掉/key/
替换:/ 和 //

url=www.taobao.com
echo ${#url}		获取变量的长度
echo ${url%.*}		www.taobao
echo ${url%%.*}		www
echo ${url#*.}		taobao.com
echo ${url##*.}		com
echo ${url/ao/AO}	www.tAObao.com  替换
echo ${url//ao/AO}	www.tAObAO.com  贪婪替换

5、四则运算

默认情况下,shell就只能支持简单的整数运算
+ - * / %(取模,求余数)

Bash shell 的算术运算有四种方式:
1. 使用 $(( ))		echo $((1*1))
2. 使用$[ ]		echo $[1+1]
3. 使用 expr 外部程式	expr 1 \* 1
除了乘法需要转义外,其余的正常运算,数字与运算符之间需要空格,expr 1 + 1
4. 使用let 命令		n=1 let n+1 echo $n
5. 带bc小数运算		yum install -y bc echo 2.3*4.5|bc
i++先赋值,再运算    ++i先运算,再赋值

6、条件判断

语法格式
格式1: test 条件表达式
格式2: [ 条件表达式 ]
格式3: [[ 条件表达式 ]]  支持正则 =~

a、文件判断

判断文件是否存在

-e	test -e file 判断是否存在,不管是文件还是目录,只要存在,条件就成立
-f	[[ -f /shell01/1.sh ]] 判断是否为普通文件
-d	[ -d /shell01/dir1 ] 判断目录是否存在,存在条件为真
-S	test -s 1.sh;echo $? 判断文件是否有内容(大小),非空文件条件满足。-s表示非空,! -s 表示空文件
-p	pipe
-c	character
-b	block
-L	软link

判断文件权限

-r	当前用户对其是否可读
-w	当前用户对其是否可写
-x	当前用户对其是否可执行
-u	是否有suid
-g	是否sgid
-k	是否有t位

判断文件新旧

test file1 -nt file2;echo $? 判断file1是否比file2新
test file1 -ot file2;echo $? 判断file1是否比file2老
test file1 -ef file2;echo $? 判断file1是否与file2相等

b、整数判断

[ ]风格

大于		-gt [1 -gt 2];echo $?
大于等于		-ge [1 -ge 2];echo $?
等于		-eq [1 -eq 2];echo $?
不等于		-ne [1 -ne 2];echo $?
小于等于		-le [1 -le 2];echo $?
小于		-lt [1 -lt 2];echo $?

(( ))类c风格

=表示赋值  ==表示判断
>	((1>2));echo $?
>=	((1>=2));echo $?
==	((1==2));echo $?
!=	((1!=2));echo $?
<=	((1<=2));echo $?
< 	((1<2));echo $?

c、字符判断

-z 判断为空
-n 判断非空
=  判断相等
!= 判断不相等

d、逻辑判断符号

-a 和 && 逻辑与,两个条件都满足才为真
[ 1 -eq 1 -a 1 -ne 0 ]为真 [ 1 -eq 1 ]&&[ 1 -ne 0 ]
-o 和 || 逻辑或,两个条件满足一个就为真
[ 1 -eq 1 -o 1 -ne 1 ]为真 [ 1 -eq 1 ]||[ 1 -ne 1 ]
&&前面的表达式为真才执行后面的内容,||前面的表达式为假才执行后面的内容