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