一、了解shell
- bash 是shell的一种
- shell是一个用c编写的程序,它位于内核和应用程序之间。
- shell是一种应用程序,用户通过这个界面访问操作系统内核的服务
- 运行shell脚本的两种方法
1.作为可执行程序 将代码保存为 .bash
2.作为解释器参数 直接运行解释器 其参数就是shell 脚本 /bin/bash hello.bash (不需要再第一行指定解释器信息)
运行bash shell的变量种类
- 1.环境变量:环境变量会在当前shell和该shell的所有子shell中生效。如果把环境变量写入相应的配置文件中,那么该环境变量就会在所有的shell中生效。设置环境变量 export 变量名=变量值
- 2.局部变量:在脚本或命令中定义,仅在当前shell实例中有效
- 3.shell变量:shell变量是有shell程序设置的特殊变量,有一部分是局部变量 有一部分是环境变量
- 4.位置变量:
位置参数变量
作用
$n
n为数字,$0代表命令本身,$1-$9代表第一至第九个参数,十以上的参数需要用大括号包含,如${10}
$*
代表命令行中所有的参数,$*把所有的参数看成一个整体
$@
也代表命令行中所有的参数,不过$@把每个参数区分对待
$#
代表命令行中所有参数的个数
shift
shift n:踢掉参数
:踢掉n个参数,默认踢掉一个参数
vim test.sh #新建test.sh 文件
#test.sh 文件内容
#!/bin/sh
echo $0
echo $1
chmod 777 test.sh #授权
./test.sh 1 2 #命令 执行test.sh
#执行结果
1
2
- 5.特殊变量(内置)
预定义变量 |
作用 |
$? |
shell中最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确 |
$$ |
当前进程的进程号(PID) |
$! |
后台运行的最后一个进程的进程号(PID) |
二、sell变量
1.定义变量
-
变量名和等号之间不能有空格
-
首字符为字母
-
中间不能有空格,可以使用下划线
-
不能使用bash的关键字
-
变量的默认类型为字符串类型,如果要对数值运算,则必须指定变量类型为数值型
-
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
2.定义只读变量
- 在定义变量的基础上
- 添加语句: readonly 变量名
3.删除变量
- 使用 : unset 变量名
字符串
定义 用单引号 或 双引号 或者不用引号
#!/bin/bash
p=2
a=not_quotation\\marks$psd #无引号 识别变量和转义字符 但字符串中不允许出现空格
b='single \\quotation \n marks$p' #单引号 单引号内的字符原样输出
c="double \"quotation\\ 'm'arks$pas" #双引号 识别变量和转义字符
echo $a "|"$b "|"$c
#结果
not_quotation\marks |single \\quotation \n marks$p |double "quotation\ 'm'arks
长度
########字符串长度#####
n="abcdef"
echo ${#n} #6
expr length $n #6
字符串拼接
#!/bin/bash
c="abcdef"
a="double"${c} #字符串拼接 #doubleabcdef
s='single'${c} #字符串拼接 #singleabcdef
a="double"c #doublec
s='single'"123" #single123
s=$a$c #doublecabcdef
a="double",${c} #double,abcdef
a="double" ${c} #报错 字符串拼接之间的地方,不可以是空格 分号; 和/
n=not${c} #字符串拼接
#总结
#####字符串拼接 可以是 字符串常量和字符串变量之间任意两个
字符串截取
#####截取字符串 ${str:start开始位置:lenght}
str=${n:2:5}
echo ${#str} ${str} #5 tabcd
str=${n:(-1):1}
echo ${#str} ${str} #1 f
str=${n:-1:0}
echo ${#str} ${str} ##9 notabcdef
str=${n:(-2):5}
echo ${#str} ${str} #2 ef
str=${n:1:2}
echo ${#str} ${str} #2 ot
str=${n::}
echo ${#str} ${str} #0
str=${n::}
echo ${#str} ${str} #0
str=${n:2:}
echo ${#str} ${str} #0
str=${n::2}
echo ${#str} ${str} #2 no
n="abcdef"
str=${n:4:3}
echo ${#str} ${str} #3 ef ###ef和一个空格
#结论
##### start length默认为0
#####截取后的子字符串的长度不大于原字符串的长度
#####仅当start为负数时 不带括号时 无论length正负还是0 截取全部 (什么原因呢?)
#####带括号 -1表示倒数第一个字符,-2表倒数第二个字符
####### 当length>0 若表示的位置不合法 则结果为空格
#######当length<=0 则返回 空
###得到的子串的长度
start>0 start+length<= 原串长度 则长度=length+1 否则 子串长度=原串长度-start+1
start<0 length<=原串长度 长度=length 否则为空或者 length
?为什么start>0 在原串末尾会得到空格 标识字符串结尾吗 那为什么 start<0 时超出末尾没有呢
选取子串
str="abcdef"
expr substr "$str" 1 3 # 从第一个位置开始取3个字符, abc
expr substr "$str" -2 5 #空
查找字符串
c="abcdef" #<expr index 内容 字符 > 作用:提取指定字符的下标
echo `expr index "$c" eb` #2 查找e或b eb之间不能有空格
echo `expr index "$c" b` #2
echo `expr index "$c" e` #5
echo `expr index "$c" z` #0
expr 命令四则运算和字符串的操作。 使用乘号时,必须用反斜线屏蔽其特定含义
expr 10 \* 2
20