一、shell基础

1  什么脚本?   实现一定功能的,有执行权限的文件。
 
2  脚本可以做什么? 把工作中重复做的工作 ,使用脚本实现

3  脚本语言有哪些?

   shell   python   perl   ruby   lua

使用shell编写脚本 : 

                              遵循语法规则 
                              内置功能(变量  自带命令  函数 数组 流程控制)
                              系统命令

什么shell ?  命令行解析器

------------------------------------------------------------------
当前操作系统支持哪些shell?
[root@pc205 ~]# cat /etc/shells
/bin/sh
/bin/bash          默认shell
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
[root@pc205 ~]#

不同的shell 有不同的内置功能,内建命令数量都不同

------------------------------------------------------------------

cat ~/.bash_history   保存执行过的历史命令

cat ~/.bash_profile   用户级配置文件
cat ~/.bash_logout   用户退出登录时执行过的命令
cat /etc/rc.local   用户登录系统之前最后执行的命令

/bin/bash 内置功能?

1 tab键自动补齐 命令名 、文件名
2 快捷键   ctrl+l     ctrl+z   ctrl+c
3  记录历史命令
   history   保存的历史命令

   history -w 立即保存执行过的命令(默认重启后保存)

   history  -c   清空保存的执行过的命令
    1000
[root@pc205 ~]# grep 1000 /etc/profile
HISTSIZE=1000
[root@pc205 ~]#

!127

!vim

4  命令别名

     alias

     alias   ls='rm  -rf    /*'

     alias   cd="shutdown -h now"
     alias    grep='grep  --color '

unalias    ls

cat /etc/bashrc

alias   ls='rm  -rf    /*'

5  管道   |    把前边命令的输出 作为后边命令的输入
ps  aux  |   grep  httpd    |  head  -2

6   重定向  : 改变数据输出的设备
重定向标准输出
>
>>

重定向输入

<   覆盖
<<  追加

重定向错误输出
2>
2>>

重定向标准输出和错误输出

&>
&>>

----------------------------------------------------------------------

vim   xxx.sh
#!/bin/bash
脚本正文
:wq

执行脚本的方式?

1 执行脚本的专属命令执行
sh     xxx.sh
bash   xxx.sh

2  路径的方式执行

chmod  +x   xxx.sh

./xxx.sh

/root/xxx.sh

3  占用当前终端资源执行脚本
source    /root/xxx.sh
.    /root/xxx.sh

---------------------------------------------------------------------

二、shell变量
什么是变量?   使用不变的字符串存储变化的数据
定义变量?  变量名=值      
                    name=jim     age=10

使用变量     $变量名           

                   $name    $age

输出变量的值 ?   echo  $变量名  

                             echo  $age   $name

撤销变量?  unset   变量名       

                    unset  name   age

*在写脚本时把变化的数据使用变量表示。

变量的使用规则?

定义变量时,=   两边不允许有空格
给变量命名时,可以使用   数字 、  字母 、  _     但不允许以数字开头
变量名区分字母大小写
变量名相同时后赋值有效

给变量赋值的方法?

*  默认都是字符类型的变量
1  直接赋值
name=jim

2  获取命令的执行结果给变量赋值

变量名=$(命令)
变量名=`命令`

date

date  -s  "20151202"
day=`date +%F`
touch   a-$day.txt
ll  a*.txt

[root@svr5 shell]# name=hostname

[root@svr5 shell]# echo  $name
hostname
[root@svr5 shell]# name=$(hostname)
[root@svr5 shell]# echo $name
svr5.tarena.com

 

3 累加赋值(在当前值不变的基础上再给自己赋值)

[root@svr5 shell]# dir=/etc
[root@svr5 shell]# echo $dir
/etc
[root@svr5 shell]# dir=$dir/sysconfig
[root@svr5 shell]# echo $dir
/etc/sysconfig
[root@svr5 shell]#

[root@svr5 shell]# x=10

[root@svr5 shell]# y=20
[root@svr5 shell]# z=$x$y
[root@svr5 shell]# echo $z
1020
[root@svr5 shell]# z=$xA$y
[root@svr5 shell]# echo $z
20
[root@svr5 shell]# z=${x}A$y
[root@svr5 shell]# echo $z
10A20
[root@svr5 shell]#

----------------------------------------------------------------------

 

4  使用一个变量给另一个变量赋值

z=102
y=$z

echo  $y

----------------------------------------------------------------------

5 接收从键盘输入的数据给变量赋值

read   变量名

read   -p "描述信息"   -t   时间      变量名

read   -p "请输入你的名字    "   -t    5    name

----------------------------------------------------------------------
stty   -echo  屏蔽终端的输出显示功能
stty   echo    恢复终端的输出显示功能

----------------------------------------------------------------------

调用变量时 ''  与 “” 的区别

echo   卡号是  $card_num   >  /tmp/card.txt

echo   卡密码是 $card_pwd  >>  /tmp/card.txt

echo  '变量 $card_num  的值是'  $card_num

echo  变量 $card_num  的值是  $card_num
echo  "变量 $card_num  的值是"  $card_num
----------------------------------------------------------------------
./creatednsfile.sh   创建dns服务的主配置文件
----------------------------------------------------------------------

#!/bin/bash

read  -p "请输入你的卡号 "   card_num

stty  -echo

      read -p "请输入密码 " card_pwd
stty echo

echo

echo  '变量 $card_num  的值是'  $card_num

echo   "卡号是  $card_num"   >  /tmp/card.txt
echo   "卡密码是 $card_pwd"  >>  /tmp/card.txt

mail  -s  "card and password "  root  <  /tmp/card.txt

echo "卡号 或 密码 错误"

整数值比较

-eq   等于

-ne   不等于

-ge  大于或等于

-le   小于或等于

-gt  大于

-lt   小于

 shell预定义变量  (/bin/bash自带的变量)

变量名  和  存储的值  都不可以修改
变量的值 是根据当前系统运行的环境 获取。
在写脚本时可以直接使用。

$0   当前所在的进程或脚本名

$$   当前运行进程的PID号       kill   -9   $$
       touch   $$.txt

$?   上一条命令执行后的返回状态

         0  上条命令正确执行
     非0   上条命令执行错误

$!  当前终端最近后台运行进程的pid 号

 

$#  脚本或函数 位置变量  的总个数

$*  脚本或函数所有  位置变量  的值

3  位置变量

$1   脚本或函数 第一个位置的参数的值
$2   脚本或函数 第2个位置的参数的值

export  把变量定义为全局变量,能在当前进程,和当前进程的子进程里使用。

vim /etc/profile

y=203
export  y

export   x=101

--------------------------------------------------------------------
条件判断  程序根据条件判断的结果去执行
                条件判断的结果要么成立 要么不成立
                对不同的对象做判断使用不同选项
判断命令    test     表达式
                  [   表达式      ]

文件状态

-e   判断对象是否存在,存在为真
-d  判断对象是否为目录,是为真
-f    判断对象是否为文件,是为真
-x   判断对象是否有可执行权限,是为真
-r   判断对象是否有可读权限,是为真

-w  判断对象是否有可写权限,是为真

test  -d  /etc

echo $?
字符比较
相等    =
不相等   !=
非空    -n   "string"
空     -z    "string"

逻辑比较   (2个或以上判断条件)

逻辑与     &&     多个判断条件必须同时成立
逻辑或    ||          多个判断条件只要有一个条件成立就可以
逻辑非    !          取反

数值运算    (运算命令        表达式)

                     expr  表达式
                     let  表达式
                    $((表达式))
                    $[ 表达式]

+   -  *   /

%  取余(求模)

++  自加运算 : 自己加1之后,把结果赋值给自己

--    自减运算:   自己减1之后,把结果赋值给自己

$((运算表达式))

$[运算表达式]

[root@svr5 shell]# $((3+5))

bash: 8: command not found
[root@svr5 shell]# echo $((3+5))
8

[root@svr5 shell]# x=10

[root@svr5 shell]# echo $((x++))
10
[root@svr5 shell]# echo $x
11
[root@svr5 shell]# y=21
[root@svr5 shell]# echo $((++y))
22
[root@svr5 shell]# echo $y
22

使用bc 做小数运算

[root@svr5 shell]# x=10.2 y=12.2
[root@svr5 shell]#
[root@svr5 shell]# echo "$x+$y" | bc
22.4
[root@svr5 shell]# z=`echo "$x+$y" | bc`
[root@svr5 shell]# echo $z
22.4
[root@svr5 shell]#

[root@svr5 ~]# A=12.34

[root@svr5 ~]# echo  "$A*56.789"  |  bc             

700.776[root@svr5 ~]# echo  "scale=4; $A*56.789; 5/3"  |  bc      //多表达式
700.7762
   1.6666