[root@pandascripts]#./test.sh
[root@pandascripts]#shtest.sh
[root@pandascripts]#bashtest.sh
[root@pandascripts]#chmod+xtest.sh
[root@pandascripts]#/scripts/test.sh
[root@pandascripts]#./test.sh
总结
1、脚本的执行顺序是从上到下,从左到右执行的
2、脚本里内容,可以理解为:
好多单个命令集合,复杂一点脚本就是加上它自己的一些语法
创建shell程序的步骤:
第一步:
创建一个包含命令和控制结构的shell文件。
第二步:
修改这个文件的权限使它可以执行。
使用chmodu+x
第三步:
执行
第2章shell变量及运用
2.1shell变量
变量是shell传递数据的一种方法。
变量是用来代表每个值的符号名。
我们可以把变量当成一个容器,脚本可以在内存中存储数据,然后通过变量。
就可以在脚本执行中进行修改和访问存储的数据
注意:
1、变量名称通常是大写字母,它可以由数字、字母(大小写)和下划线_组成。
但是大家要注意变量名称不能以数字开头
2、等号=用于为变量分配值,在使用过程中等号两边不能有空格
3、变量存储的数据类型是整数值和字符串值
4、在对变量赋于字符串值时,建议大家用引号将其括起来。
因为如果字符串中存在空格隔符号。
BASE会把空格字符解释为单词分隔管符
5、要对变量进行调用,可以在变量名称前加美元符号$
BASESHELL的扩展功能:
我们最常见的就是扩展变量值和命令替换和算术扩展
1、$name是${name}的简化版本,但是在某些情况下,还必须使用花括号引起的方式来消除歧义并避免意外的结果
2、命令的替换就是将命令的调用替换为执行命令后的结果的输出,它的使用方式:
我们将命令括在反引号中`旧形式`来调用命令结果,(新形式)是使用$()语法
3、在命令替换中,使用新语法$(),它允许进行嵌套命令替换
4、进行算术扩展时使用$[]进行,同时它也允许算术替换
Shell有两类变量:
局部变量和全局变量。
(1)局部变量:
是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。
用户自定义的脚本中的变量,它会随着脚本的执行结束而结束
在用户的配置文件当中定义的环境变量,这个变量是会一直跟着用户存在,直到这个用户退出
(2)全局变量:
是环境变量,其值不随shell脚本的执行结束而消失。
【例3】$PATH
[root@pandascripts]#echo$PATH
/usr/lib64/qt-3.3/bin:
/usr/local/sbin:
/usr/local/bin:
/sbin:
/bin:
/usr/sbin:
/usr/bin:
/root/bin
作用:
运行某个命令的时候,本地查找不到某个命令或文件,会到这个声明的目录中去查找。
(3)用户定义变量
由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,并且大小写字母意义不同。
变量名长度没有限制。
使用变量值时,要在变量名前加上前缀“$”。
/mnt|⇒VAR1=123
/mnt|⇒echoVAR1
VAR1
/mnt|⇒echo$VAR1
123
/mnt|⇒COUNT=nihao
/mnt|⇒first_name=xuegod
/mnt|⇒_ID_NUM=123
/mnt|⇒错误的写法如下
/mnt|⇒3COUNT=nnnnnn
zsh:
3COUNT=nnnnnn:
commandnotfound...
zsh:
commandnotfound:
3COUNT=nnnnnn
/mnt|⇒firname=xuegod1705
zsh:
1705:
commandnotfound...
zsh:
commandnotfound:
1705
/mnt|⇒firname="xuegod1705"
/mnt|⇒firname='xuegod1705'
/mnt|⇒DATE=`date-F`
date:
invalidoption--'F'
Try'date--help'formoreinformation.
/mnt|⇒DATE=`date+%F`
/mnt|⇒echo$DATE
2017-07-01
/mnt|⇒echo${DATE}-mysql.log
2017-07-01-mysql.log
/mnt|⇒echo$DATE-mysql.log
2017-07-01-mysql.log
/mnt|⇒echo$DATEmysql.log
.log
2.2主要赋值类型
(1)变量赋值:
赋值号“=”两边应没有空格。
【例4】用“=”对变量赋值
/mnt|⇒A=aaa
zsh:
A:
commandnotfound...
zsh:
commandnotfound:
A
/mnt|⇒A=aaa
zsh:
aaanotfound
/mnt|⇒A=aaa
zsh:
aaa:
commandnotfound...
zsh:
commandnotfound:
aaa
(2)将一个命令的执行结果赋给变量
两种命令替换方式一种是反引号:
``一种是$(),其中反引号是不允许嵌套使用。
后面的这个可以
/mnt|⇒echo$(date)
SatJul121:
27:
21CST2017
/mnt|⇒echo`date`
SatJul121:
27:
32CST2017
/mnt|⇒DATE=$(ls/opt)
/mnt|⇒echo$DATE
rh
/mnt|⇒ls/opt
rh
命令的嵌套使用
/mnt|⇒OUTFILE=$(tarcvf/tmp/b.tar$(find/root-name"*.txt"))
tar:
Removingleading`/'frommembernames
/mnt|⇒echo$OUTFILE
/root/.cache/tracker/db-version.txt
/root/.cache/tracker/db-locale.txt
/root/.cache/tracker/miner-applications-locale.txt
/root/.cache/tracker/last-crawl.txt
/root/.cache/tracker/first-index.txt
/root/.local/share/autojump/autojump.txt
/root/a.txt
/root/.oh-my-zsh/LICENSE.txt
/root/.oh-my-zsh/plugins/emoji/emoji-data.txt
/root/.oh-my-zsh/plugins/golang/templates/package.txt
/root/.oh-my-zsh/plugins/golang/templates/search.txt
/root/.oh-my-zsh/plugins/zsh-navigation-tools/.config/znt/README.txt
/mnt|⇒find/root-name"*.txt"
/mnt|⇒tarcvf/tmp/b.tar$(find/root-name"*.txt")
/mnt|⇒OUTFILE=$(tarcvf/tmp/b.tar$(find/root-name"*.txt"))
/mnt|⇒echo$OUTFILE
(3)可以利用变量和其它字符组成一个新的字符串
[root@pandascripts]#MYDIR=/home/mk
[root@pandascripts]#echo$MYDIRzhangsan
[root@pandascripts]#/home/mk/zhangsan
[root@pandascripts]#echo$MYDIR/zhangsan
/home/mk/zhangsan
[root@pandascripts]#echo${MYDIR}/zhangsan
/home/mk/zhangsan
[root@pandascripts]#DAY=mon
[root@pandascripts]#echotodayis$DAYday
todayis
[root@pandascripts]#echotodayis${DAY}day
todayismonday
2.3给变量赋值多个单词
[root@pandascripts]#name="mikeron"
[root@pandascripts]#echo$name
mikeron
[root@pandascripts]#name='shenmk'
[root@pandascripts]#echo$name
shenmk
【例6】赋值时“”和’’的区别
总结:
❑单引号:
之间的内容原封不动地指定给了变量。
❑双引号:
特殊符号的含义保留。
2.4把命令当作变量进行定义
[root@pandascripts]#wen=`date+%F`#利用反引号进行定义
[root@pandascripts]#echo$wen
2016-11-02
[root@pandascripts]#wen=$(date)#利用小括号加$进行定义
[root@pandascripts]#echo$wen
2016年11月02日星期三19:
44:
20CST
第3章对变量的管理
set命令,例:
[root@pandascripts]#DAY=mon
[root@pandascripts]#set|grepDAY
DAY=mon
3.2删除变量
[root@pandascripts]#unsetDAY
[root@pandascripts]#echo$DAY
第4章位置变量和特殊变量
Shell解释执行用户的命令时,将命令行的第一个字作为命令名,而其它字作为参数。
由出现在命令行上的位置确定的参数称为位置参数。
使用$N来表示
$0获取当前执行shell脚本的文件文件名,包括脚本路径
$n获取当前脚本的第n个参数n=1,2.....n当n大于9时用{n}表示。
【例8】传递参数
[root@pandascripts]#cat8.sh
#!
/bin/bash
#author:
awk
echo"----------------------"
echo"Shell传递参数实例!
";
echo"执行的文件名:
$0";
echo"第一个参数为:
$1";
echo"第二个参数为:
$2";
echo"第三个参数为:
$3";
echo"----------------------"
[root@pandascripts]#sh8.sh123
----------------------
Shell传递参数实例!
执行的文件名:
example02.sh
第一个参数为:
1
第二个参数为:
2
第三个参数为:
3
----------------------
4.2特殊变量
有些变量是一开始执行Script脚本时就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量。
这些变量当一执行程序时就有了,以下是一些特殊变量:
$*
以一个单字符串显示所有向脚本传递的参数;
如"$*"用【"】括起来的情况、以"$1$2…$n"的形式输出所有参数
$#
传递到脚本的参数个数
$@
与$*相同,但是使用时加引号,并在引号中返回每个参数
如"$@"用「"」括起来的情况、以"$1""$2"…"$n"的形式输出所有参数
$$
这个程序的PID
$?
显示最后命令的退出状态;0表示没有错误,其他任何值表明有错误
$!
上一个后台进程的ID
【例9】
[root@pandashell]#cat9.sh
echo$1$2$3$4$5$6$7$8$9
echo"脚本名字"
echo$0
echo"脚本参数个数"
echo"thenumberofvaluesis$#"
echo"脚本参数列表"
echo$*
echo"脚本参数列表"
echo$@
echo"上一次执行结果的状态码"
echo$?
echo"这个程序的PID号"
echo$$
执行结果:
[root@pandascripts]#sh9.sh`seq9`
123456789
脚本名字
example03.sh
脚本参数个数
thenumberofvaluesis9
脚本参数列表
123456789
脚本参数列表
123456789
上一次执行结果的状态码
0
这个程序的PID号
12869
注意:
$*与$@区别
相同点:
都是引用所有参数。
不同点:
只有在双引号中体现出来。
假设在脚本运行时写了三个参数1、2、3,,则"*"等价于"123"(传递了一个参数),而"@"等价于"1""2""3"(传递了三个参数)
【例10】
[root@pandascripts]#cat10.sh
#!
/bin/bash
#author:
awk
echo"---\$*演示---"
foriin"$*";do
echo$i
done
echo"--\$@演示---"
foriin"$@";do
echo$i
done
执行结果如下:
[root@pandascripts]#sh10.sh12345
---$*演示---
12345
--$@演示---
1
2
3
4
5
第6章变量的数值计算
用于执行简单的整数运算
格式:
$((算数运算符))
((表达式1,表达式2…))
特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:
a++,b--等。
a++等价于a=a+1
2、在双括号结构中,所有变量可以不加入:
“$”符号前缀。
3、双括号可以进行逻辑运算,四则运算
4、双括号结构扩展了for,while,if条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开
常用的算数运算符
运算符
意义
++--
递增及递减,可前置也可以后置
+-!
~
一元运算的正负号逻辑与取反
+-*/%
加减乘除与余数
<<=>>=
比较大小符号
==!
=
相等不相等
>><<
向左位移向右位移
&^|
位的与位的异或位的或
&&||
逻辑与逻辑或
?
:
条件判断
【例13】三种简单的赋值运算
[root@pandashell]#((a=1+2**3-4%3))#2**3为2的3次方
[root@pandashell]#echo$a
8
[root@pandashell]#b=$((1+2**3-4%3))
[root@pandashell]#echo$b
8
[root@pandashell]#echo$((1+2**3-4%3))
#省去了定义一个变量
8
【例14】递增\递减的应用
[root@pandashell]#echo$((a+=1))
9
[root@pandashell]#echo$((a++))
#等同于a+=1
10
[root@pandashell]#echo$((a--))
11
[root@pandashell]#echo$a
#a++或a--为先赋值再a加1或a减1
10
[root@pandashell]#echo$((--a))
9
[root@pandashell]#echo$a
#--a或++a为先a加1或a减1再进行a的赋值
9
【例15】比较大小
[root@pandashell]#echo$((1>2))
0
[root@pandashell]#echo$((1<=2))
#真为1假为0
1
【例16】1到100所有整数和
[root@pandashell]#echo$((100*(1+100)/2))
5050
[root@panda~]#echo$[100*$[1+100]/2]
5050
【例17】写一个简单四则运算的脚本
[root@pandashell]#cat17.sh
a=6
b=2
echo"a-b=$(($a-$b))"
echo"a+b=$(($a+$b))"
echo"a*b=$(($a*$b))"
echo"a/b=$(($a/$b))"
echo"a**b=$(($a**$b))"
echo"a%b=$(($a%$b))"
执行结果:
[root@pandashell]#sh17.sh
a-b=4
a+b=8
a*b=12
a/b=3
a**b=36
a%b=0
升级后的脚本
[root@pandashell]#cat17-1.sh
a=$1
b=$2
echo"a-b=$(($a-$b))"
echo"a+b=$(($a+$b))"
echo"a*b=$((a*b))"
echo"a/b=$(($a/b))"
echo"a**b=$[$a**$b]"
echo"a%b=$[$a%$b]"
或者
[root@pandashell]#cat17-2.sh
read-p"entera:
"a
read-p"enterb:
"b
echo"a-b=$(($a-$b))"
echo"a+b=$(($a+$b))"
echo"a*b=$(($a*$b))"
echo"a/b=$(($a/$b))"
echo"a**b=$(($a**$b))"
echo"a%b=$(($a%$b))"