【shell】
shell
- 一、shell简介
- 二、shell脚本的执行方式
- 三、shell变量
- 3.1 shell变量介绍
- 3.2 shell变量的定义
- 3.1.1 基本语法
- 3.2.2 定义变量的规则
- 3.2.3 将命令的返回值赋予变量
- 四、环境变量的设置
- 4.1 基本语法:
- 五、位置参数变量
- 5.1 基本介绍
- 5.2 基本语法
- 六、预定义变量
- 6.1 基本介绍
- 6.2 基本语法
- 七、运算符
- 九、流程控制
- 9.1 if 条件判断
- 9.2 常用判断条件:
- 9.3 case语句
- 9.4 for循环
- 9.5 while循环
- 9.6 read读取控制台输入
- 9.6.1 基本语法:read [选项] [参数]
- 9.6.2 用法:
- 9.6.3 参数说明:
- 9.7.4 .参数解读实例:
- 9.7.4.1 -a 参数
- 9.7.4.2 -d
- 9.7.4.3 -p
- 9.7.4.4 -n
- 9.7.4.5 -r
- 9.7.4.6 -s
- 9.7.4.7 -t
- 9.7.4.8 -u
- 十、shell函数
- 10.1 系统函数
- 10.1.1 basename函数
- 10.1.2 dirname函数
- 10.2 自定义函数
- 十一、在 Shell 脚本中调用另一个 Shell 脚本的三种方式
- 11.1 fork
- 11.2 exec
- 11.3 source
- 十二、等待.sh脚本仅在另一个脚本完成后才能运行?
- 12.1 &&连接器
- 12.2 连接器
一、shell简介
shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。
二、shell脚本的执行方式
1.脚本以#!/bin/bash开头
2.脚本需要有可执行权限
三、shell变量
3.1 shell变量介绍
1.Linux shell中的变量分为系统变量和用户自定义变量
2.系统变量:
H
O
M
E
、
HOME、
HOME、PWD、
S
H
E
L
L
、
SHELL、
SHELL、USER等
3.显示当前shell中的所有变量:set
3.2 shell变量的定义
3.1.1 基本语法
1.定义变量:变量=值
2.撤销变量:unset 变量
3.声明静态变量:readonly 变量(静态变量声明后不能撤销)
4.多行注释的写法::<<! txt !(开头和结尾都单独一行)
3.2.2 定义变量的规则
1.变量名称可以由字母、数字和下划线组成,但是不能以数字开头
2.等号两侧不能有空格.
3.变量名称一般习惯为大写.
3.2.3 将命令的返回值赋予变量
1.A=‘date’反引号,运行里面的命令,并把结果返回给变量A
2.A=$(date)等价于反引号
四、环境变量的设置
4.1 基本语法:
1.export 变量名=变量值(功能描述:将shell变量输出为环境变量/全局变量)
2.source 配置文件(功能描述:让修改后的配置信息立即生效)
3.echo $变量名(功能描述:查询环境变量的值)
五、位置参数变量
5.1 基本介绍
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。比如:./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息。
5.2 基本语法
$n(功能描述:n为数字,$0代表命令本身,$1-
9
代表第一到第九个参数,十以上的参数需要用大括号包含,如
9代表第一到第九个参数,十以上的参数需要用大括号包含,如
9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10})
∗
(功能描述:这个变量代表命令行中所有的参数,
*(功能描述:这个变量代表命令行中所有的参数,
∗(功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)
@
(功能描述:这个变量也代表命令行中所有的参数,不过
@(功能描述:这个变量也代表命令行中所有的参数,不过
@(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)
$#(功能描述:这个变量代表命令行中所有的参数个数)
六、预定义变量
6.1 基本介绍
shell设计者事先已经定义好的变量,可以直接在shell脚本中使用。
6.2 基本语法
$$ (功能描述:当前进程的进程号(PID))
$!(功能描述:后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
七、运算符
基本语法:
1.
(
(
运算符
)
)
或者
((运算符))或者
((运算符))或者[运算式]或者expr m + n
2.注意expr运算符间要有空格,如果希望将expr的结果赋给某个变量,使用反引号或者$
3.expr *,/,%分布代表乘,除,取余
九、流程控制
9.1 if 条件判断
基本语法:(注意condition前后要有空格)
if [ condition ]
then 语句
elif
then 语句
fi
9.2 常用判断条件:
字符串比较(=)
两个整数的比较
-lt(小于) //less than 小于
-le(小于等于) //
-eq(等于) //equal 等于
-gt(大于) //greater than 大于
-ge(大于等于) //
-ne(不等于) //
按照文件权限进行判断
-r (有读的权限)
-w (有写的权限)
-x(有执行的权限)
按照文件类型进行判断
-f (文件存在并且是一个常规文件)
-e(文件存在)
-d(文件存在并是一个目录)
9.3 case语句
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
9.4 for循环
基本语法1:
for 变量 in 值1 值2 值3...
do
程序
done
基本语法2:
for((初始值;循环控制条件;变量变化))
do
程序
done
9.5 while循环
while [ 条件判断式 ]
do
程序
done
9.6 read读取控制台输入
9.6.1 基本语法:read [选项] [参数]
选项:
- -p:指定读取值时的提示符
- -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待。
9.6.2 用法:
- 用于从标准输入读取数据(键盘)
- 也可以从文件中读取(此时是读取一行文件)
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-p prompt] [-t timeout] [-u fd] [name…]
9.6.3 参数说明:
- -a 后面跟一个变量,该变量会被认为为数组,然后给其复制,默认是以空格为分隔符
- -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志
- -p 后面跟提示信息,即在输入前面打印提示信息
- -e 在输入的时候可以使用,命令补全功能
- -n 后面跟一个数字,定义输入文本的长度,很实用
- -r 屏蔽\,若没有该选项,则\作为一个转义字符,有的话反斜杠就是个正常的字符了。
- -s 安静模式,在输入字符时不再屏幕上面显示(常用于输入密码)
- -t 后面跟秒数,定义输入字符的等待时间
- -u 后面跟fd,从文件描述符中读取,该文件描述符可以是exec新开启的
9.7.4 .参数解读实例:
9.7.4.1 -a 参数
-
从键盘读取一组数据进行四则运算
read -a score #读取三个元素进入score数组
echo ${score[@]} #挨个输出score数组中的元素,不换行 -
输出结果
输入:11 12 13
输出:11 12 13
9.7.4.2 -d
- 限定读取到那一个字符停止读取,比如下面就是限定读取到字符s,只有第一个字符重要
read -d sscsc v
echo -e “\n”
echo $v
9.7.4.3 -p
-
-p选项是为了显示提示信息
read -p “请输入你的密码:” passward
echo $passward -
结果
$ bash 1.sh
请输入你的密码:1234567
1234567
9.7.4.4 -n
- 定义输入密码的长度为8
read -n8 -p “请输入你的密码:” passward #控制密码的
echo -e “\n”
echo -e $passward - 输出结果
请输入你的密码:12345678
12345678
9.7.4.5 -r
-
读取一段字符串 123adda\ncsdd
read -r -p “请输入字符串” str
echo -e “\n”
echo $str -
输出结果
请输入字符串123adda\ncsdd
123adda\ncsdd
9.7.4.6 -s
-
这个选项常和-p一起使用
read -p “请输如你的密码:” -s -n8 passward
echo -e “\n密码”
echo $passward -
输出结果
请输如你的密码:
密码
12345678
9.7.4.7 -t
- 指定输入字符的等待时间就好像那些输入验证码的程序,输错了第次就要等待时间再次进行输入
9.7.4.8 -u
- 创建两个文件1.txt,2.txt,然后拼接两个文件的第三行和第四行
$ cat 1.xtxt
a
b
c
d
$ cat 2.txt
1
2
3
4
while read -u2 i && read -u3 j
do
echo $i $j
done 2<1.txt 3<2.txt
- 输出结果
a 1
b 2
c 3
d 4
十、shell函数
10.1 系统函数
10.1.1 basename函数
功能:返回完整路径最后/的部分,常用于获取文件名
基本语法:basename [pathname] [suffix](功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来)。
选项:suffix为后缀,如果被指定,basename会将pathname中的suffix去掉。
10.1.2 dirname函数
功能:返回完整路径最后/前面的部分,常用于返回路径部分。
基本语法:dirname 文件绝对路径(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
10.2 自定义函数
[ function ] funcname()
{
Action;
[return int;]
}
十一、在 Shell 脚本中调用另一个 Shell 脚本的三种方式
11.1 fork
fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。
11.2 exec
exec 与 fork 不同,不需要新开一个子 Shell 来执行被调用的脚本. 被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec 调用一个新脚本以后, 父脚本中 exec 行之后的内容就不会再执行了。这是 exec 和 source 的区别.
11.3 source
与 fork 的区别是不新开一个子 Shell 来执行被调用的脚本,而是在同一个 Shell 中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。
十二、等待.sh脚本仅在另一个脚本完成后才能运行?
12.1 &&连接器
只需使用&&连接器(即复合命令):
./script1.sh && ./script2.sh
1
但是请注意,只有script1.sh 即第一个脚本退出代码为0(即没有错误)时,才会执行第二个脚本。
12.2 连接器
如果要执行序列,无论第一个脚本的结果如何,只需执行以下操作
./script1.sh ; ./script2.sh
您可以测试两个连接器的行为:
$ true && echo aa
aa
$ false && echo aa
$ false ; echo aa
aa