shell编程

2019-10-03  本文已影响0人  linux_龍

1.什么是shell编程

shell命令解释器

2.开发语言中程序代码的分类

3.执行脚本

(1)方法一:
直接运行脚本加上x权限

[root@m01 /server/scripts]# vim touch.sh
[root@m01 /server/scripts]# ll touch.sh 
-rw-r--r-- 1 root root 52 Sep  5 17:45 touch.sh
[root@m01 /server/scripts]# chmod +x touch.sh 
[root@m01 /server/scripts]# . /server/scripts/touch.sh
[root@m01 ~]# tree /oldboy
/oldboy
└── oldboy01

0 directories, 1 file

(2)方法er:
sh 执行

[root@m01 ~]# sh /server/scripts/touch.sh
[root@m01 ~]# tree /oldboy
/oldboy
└── oldboy01

0 directories, 1 file

(3)方法三:
source 或 . 替你在当前环境中执行一次脚本

[root@m01 /server/scripts]# . touch.sh
[root@m01 /server/scripts]# tree /oldboy
/oldboy
└── oldboy01

0 directories, 1 file
[root@m01 /server/scripts]# source touch.sh 
[root@m01 /server/scripts]# tree /oldboy
/oldboy
└── oldboy01

0 directories, 1 file
image.png

(4)方法4
输入重定向方法

[root@m01 /server/scripts]# sh <touch.sh 
[root@m01 /server/scripts]# tree /oldboy
/oldboy
└── oldboy01

0 directories, 1 file

4.shell编程基础知识

5.shell中的变量

举例 x+y=20 已知x=30 y=? 未知数
变量

6.变量的命名规则:

7.sh与source (.)区别

[root@m01 /server/scripts]# cat shon.sh
#!/bin/bach

echo $OLDBOY
[root@m01 /server/scripts]# OLDBOY=666

[root@m01 /server/scripts]# sh shon.sh

[root@m01 /server/scripts]# source shon.sh
666

8.应用场景:

调用系统命令测试shell
. /etc/init.d/functions
[root@m01 /server/scripts]# . /etc/init.d/functions
[root@m01 /server/scripts]# action '服务OK' /bin/true
服务OK                                                     [  OK  ]
[root@m01 /server/scripts]# action '服务挂了' /bin/talse
服务挂了 -bash: /bin/talse: No such file or directory
                                                           [FAILED]

9.变量

[root@m01 ~]# oldboy='oldboy 666'
[root@m01 ~]# echo $oldboy
oldboy 666

变量中的符号

单引号 所见即所得 原封不动的输出
双引号 与单引号类似 对特殊符号进行解析(() `` !)
无引号 与双引号类似 支持通配符 ({} * *.)
反引号 优先执行 优先执行里面的命令

10.变量分类

1.环境变量(全局变量)

env
env命令时gnu的coreutils包内的一个软件,它的功能是:在一个修改后的环境里执行命令。
declare
declare为shell指令,在第一种语法中可用来声明变量并设置变量的属性([rix]即为变量的属性),在第二种语法中可用来显示shell函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。
export 
Linux export命令用于设置或显示环境变量。
在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登陆操作。
image.png

2.普通变量(局部变量)

[root@m01 ~]# day=7
[root@m01 ~]# echo $day
7
[root@m01 ~]# echo $dayday

[root@m01 ~]# echo ${day}day
7day

11.与变量相关的文件

image.png

12.特殊变量

13.特殊重要变量位置

image.png

1.$0

[root@m01 /server/scripts]# cat shos.sh
#!/bin/bash
echo $0
[root@m01 /server/scripts]# sh shos.sh
shos.sh
[root@m01 /server/scripts]# sh /server/scripts/shos.sh 
/server/scripts/shos.sh

2.$n 数字

[root@m01 /server/scripts]# cat shoy.sh 
#!/bin/bash
echo "Usage: $0 {start|stop|restart}"
echo "$1 $2 $3"
[root@m01 /server/scripts]# sh shoy.sh a b c
Usage: shoy.sh {start|stop|restart}
a b c

故障预警:
n n超过9 从10开始 需要使用{10}

3.$#

[root@m01 /server/scripts]# cat shoq.sh  
#!/bin/bash
if [ $# -eq 0 ];then 
echo "Usage: $0  {start|stop|restart}" 
fi


[root@m01 /server/scripts]# sh shoq.sh 
Usage: shoq.sh  {start|stop|restart}

4.*@

14.特殊位置变量

image.png

15.特殊变量 状态

? 上一条命令的执行的结果 为0正确 非0失败 $$ 当前运行脚本的pid! 上一个运行脚本的pid
$_ 上一个ming6ling或脚本的最后一个参数esc+.

1.$?

2.$$

16.变量子串

[root@m01 ~]# oldboy=xiaolv
[root@m01 ~]# echo $oldboy
xiaolv
[root@m01 ~]# echo ${oldboy}
xiaolv
[root@m01 ~]# echo ${#oldboy}
6
[root@m01 ~]# 

1. 统计字符数方法

[root@m01 ~]# echo ${oldboy}
xiaolv
[root@m01 ~]# echo ${oldboy} |wc -L
6
[root@m01 ~]# echo ${oldboy} |awk '{print length()}'
6

面试题: I am oldboy linux,welcome to our training. 显示这串字符中 单 词字符数大于6的单词
方法一

[root@m01 /server/scripts]# cat stat.sh
#!/bin/bash
stat='I am oldboy linux,welcome to our training' 
for n in $stat
do
 if [ ${#n} -gt 6 ];then
    echo $n
fi
done
[root@m01 /server/scripts]# sh stat.sh
linux,welcome
training

2.按照范围cut

[root@m01 /server/scripts]# test='I am oldboy teacher'
[root@m01 /server/scripts]# echo $test |cut -c1-4
I am
[root@m01 /server/scripts]# echo ${test:4}
oldboy teacher
[root@m01 /server/scripts]# echo ${test:2}
am oldboy teacher
[root@m01 /server/scripts]# echo ${test:2:4}
am o
[root@m01 /server/scripts]# echo ${test:4:6}
oldbo

3.删除

[root@m01 /server/scripts]#  test='I am oldboy teacher' 
[root@m01 /server/scripts]#  echo "${test#o}" 
I am oldboy teacher
[root@m01 /server/scripts]#  echo "${test#I}" 
 am oldboy teacher
[root@m01 /server/scripts]#  echo "${test#*o}" 
ldboy teacher
[root@m01 /server/scripts]#  echo "${test##*o}" 
y teacher     
#相当于正则^
[root@m01 /server/scripts]#  test='I am oldboy teacher' 
[root@m01 /server/scripts]#  echo "${test%o*}" 
I am oldb
[root@m01 /server/scripts]#  echo "${test%%o*}" 
I am 
%百分号从末尾开始删除

4.替换(sed)

[root@m01 /server/scripts]#  test='I am oldboy teacher' 
[root@m01 /server/scripts]# echo ${test/oldboy/oldgirl/}
I am oldgirl/ teacher
[root@m01 /server/scripts]# echo ${test/o/}
I am ldboy teacher
[root@m01 /server/scripts]# echo ${test//o/}
I am ldby teacher
[root@m01 /server/scripts]# echo ${test//[a-z]/}

[root@m01 /server/scripts]# echo ${test//[a-z]/666}
666 666666 666666666666666666 666666666666666666666

17.变量扩展

内容
含义
${parameter:-word}
如果parameter没有被赋值或者其值为空,那么
就以word作为其值。
如果parameter没有被赋值或者其值为空,那么
${parameter:=word}
就以word作为其值,且将word赋值给
parameter。
如果parameter没有被赋值或者其值为空,那么
${parameter:?word}
就把word作为错误输出否则显示parameter内
容
如果parameter没有被赋值或者其值为空,就什
${parameter:+word}
么都不做否则用word替换变量内容

1.${parameter:-word}

如果parameter没有被赋值或者其值为空,那么就以word作为其值 给变量设置默认值(初始值) 删除操作的时候 设置1个默认的目

[root@m01 /server/scripts]# test='I am oldboy teacher'
[root@m01 /server/scripts]# echo ${test:-var not define}
I am oldboy teacher
[root@m01 /server/scripts]# unset test
[root@m01 /server/scripts]# echo $test

[root@m01 /server/scripts]# echo ${test:-var not define}
var not define

2.${parameter:=word

[root@m01 /server/scripts]# test='I am oldboy teacher'
[root@m01 /server/scripts]# echo ${test:=I am linux teacher}
I am linux teacher
[root@m01 /server/scripts]# unset test
[root@m01 /server/scripts]# echo ${test:=I am linux define}
I am linux define
[root@m01 /server/scripts]# echo $test
I am linux define

3.${parameter:?word}

[root@m01 /server/scripts]# echo ${test:=?I am linux define}
I am linux define
[root@m01 /server/scripts]# echo $?
0
[root@m01 /server/scripts]# unset test
[root@m01 /server/scripts]# echp ${test:?I am linux teacher}
-bash: test: I am linux teacher
[root@m01 /server/scripts]# echo $?
1

4. ${parameter:+word}

[root@m01 /server/scripts]# echo $test

[root@m01 /server/scripts]# echo ${test:+oldboyedu}

[root@m01 /server/scripts]# test=xiaolv
[root@m01 /server/scripts]# echo ${test:+oldboyedu}
oldboyedu
[root@m01 /server/scripts]# echo $test
xiaolv

18.运算

- 运算符
+ -  * 、 %(取余)
&&
||
+=
a+=1 <->a=a+1
8/4 =2 余0
7/4 =1 余3
image.png

方法1. (())

[root@m01 /server/scripts]# a=1
[root@m01 /server/scripts]# b=2
[root@m01 /server/scripts]# echo $a+$b
1+2
[root@m01 /server/scripts]# ((c=a+b))
[root@m01 /server/scripts]# echo $c
3

方法2.let

[root@m01 /server/scripts]# let c=a+b
[root@m01 /server/scripts]# let c=a+b+b+b
[root@m01 /server/scripts]# echo $c
7

方法3.expr

* 乘号有特殊含义
[root@m01 /server/scripts]# expr 1 + 2
3
[root@m01 /server/scripts]# expr 2 * 3
expr: syntax error
[root@m01 /server/scripts]# expr 2 \* 3
6
判断参数是否为数字

方法4.bc

[root@m01 /server/scripts]# echo 10/3 |bc -l
3.33333333333333333333

方法5.$[]

不能计算小数点
[root@m01 /server/scripts]# echo $[1/3]
0
[root@m01 /server/scripts]# echo $[10**3]
1000

方法6.awk

[root@m01 /server/scripts]# awk 'BEGIN{print 1/3}'
0.333333

linux下面的计算方法统计:

种类 方法
awk 'BEGIN{}
echo + bc -l
$(())
let
expr
$[]·

1.书写简单计算器

[root@m01 /server/scripts]# cat cal-v1.sh
#!/bin/bash
num1=$1
num2=$2
echo "$1 + $2" |bc -l
echo "$1 * $2" |bc -l
echo "$1 - $2" |bc -l
echo "$1 / $2" |bc -l
[root@m01 /server/scripts]# sh cal-v1.sh 10 20
30
200
-10
.50000000000000000000
第一种方法:
[root@m01 /server/scripts]# cat cal-v1.sh
#!/bin/bash
num1=$1
num2=$2
if [ $# -ne 2 ]
then
 echo "Usage:$0 num1 num2"
 exit 1
fi
expr $num1 + $num2 + 666 &>/dev/null
if [ $? -ne 0 ]
echo "Usage: $0 num1 num2"   
exit 2 
fi 
echo "$1 + $2" |bc -l
echo "$1 * $2" |bc -l
echo "$1 - $2" |bc -l
echo "$1 / $2" |bc -l
使用:
[root@m01 /server/scripts]# sh cal-v1.sh 1 2
3
2
-1
.50000000000000000000
第二种方法:
#!/bin/bash
read -p "请输入2个参数" num1 num2

expr $num1 + $num2 + 666 &>/dev/null
if [ $? -ne 0 ]
then
    echo "Usage: $0 num1 num2" ? 
exit 2
fi
echo "$num1 + $num2" |bc -l
echo "$num1 * $num2" |bc -l
echo "$num1 - $num2" |bc -l
echo "$num1 / $num2" |bc -l
使用
[root@m01 /server/scripts]# sh cal-v1.sh
请输入2个参数1 2
3
2
-1
.50000000000000000000

计算器书写注意方式

**项目分析:(拆解)1 2 3

image.png

19.条件测试语

1.文件

名称 含义
-d directory 目录是否存在
-f file 文件是否存在
-e exist 是否存在
-r read 文件是否存在 并且 是否有r权限
-w write 文件是否存在 并且 是否有w权限
-x execute 文件时候存在 并且 是否有x权限
-s size 文件是否存在 并且 是否为空 大于0成立
-L Symlink (symbolic link) 判断文件是否存在 是否为软连接
/etc/hosts 文件存在 输出1 不存在输出0
[root@m01 ~]# test -f /etc/hosts && echo 1 || echo 0
1
/etc/ho 文件存在 输出1 不存在输出0
[root@m01 ~]# test -f /etc/hos && echo 1 || echo 0
0
/etc/ho 目录存在 输出1 不存在输出0
[root@m01 ~]# test -d /etc/hos && echo 1 || echo 0
0
文件是否存在并且拥有x权限输出1 否则输出0
[root@m01 ~]# test -x /etc/rc.local && echo 1 || echo 0
0
文件是否存在并且拥有x权限输出1 否则输出0
[root@m01 ~]# [ -x /etc/rc.d/rc.local ] && echo 1 || echo 0
0

系统脚本判断案列:

如果不是文件 退出并输出6 
#!/bin/bash

if [ ! -f /etc/sysconfig/network ];then
   exit 6
fi
[root@m01 /server/scripts]# sh then.sh
[root@m01 /server/scripts]# echo $?
0

** 常用的格式**

满足条件 执行某个命令
[ 条件 ] && 命令

满足条件 执行多条命令
[ 条件 ] && {
cmd1
cmd2
}
[ 条件 ] || 命令
[ 条件 ] || {
cmd1
cmd2
}

20.字符串

表达式 含义
-n not zero 如果变量/字符串不是空的
-z zero 如果变量/字符串是空
"串1 "= 判断两个字符串/变量内容 是否一致 如果相等 则 成立
"串2 " true 温馨提示加上双引号
"串1"! = 判断两个字符串 /变量内容 是否一致 如果不相等 则成立
"串2" true
没有定义变量  为空 输出1
[root@m01 /server/scripts]# [ -z "$oldboy" ] && echo 1 || echo 0
1
定义了变量 不为空 输出0
[root@m01 /server/scripts]# oldboy=1
[root@m01 /server/scripts]# [ -z "$oldboy" ] && echo 1 || echo 0
0
为18输出1 不为输出0
[root@m01 /server/scripts]# oldboy=28
[root@m01 /server/scripts]# [ "x$oldboy" = "x18" ] && echo 1 || echo 0
0

字符串比较注意事项

上一篇 下一篇

猜你喜欢

热点阅读