1、shell编程之为什么学、怎么学

为什么学shell编程

Linux系统批量管理

提升工作效率,减少重复工作

学好shell编程所需要的基础知识

熟悉使用vim编辑器

熟悉SSH终端

熟练掌握Linux常用命令

熟练掌握Linux正则表达式及三剑客命令(grep、sed、awk)

如何学shell编程

阅读、模仿、阅读、模仿

核心:多练---->多思考---->再练---->再思考,坚持循环即可

大忌:不可拿来主义,可以模仿,但是要自己嚼烂了再吃下去

本阶段学习要求

看懂简单脚本

尝试写脚本

变量,循环,判断

2、shell编程基础

什么是shell

命令解释器:你输入的命令,谁来给你运行、解释

Centos默认的Shell是bash

[root@luffy-001 log]# echo $SHELL    SHELL变量
/bin/bash
[root@luffy-001 log]# cat /etc/shells 所有的命令解释器
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
[root@luffy-001 log]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash root用户 的命令解释器
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
pizza:x:500:500::/home/pizza:/bin/bash
oldboy:x:501:501::/home/oldboy:/bin/bash

什么是Shell脚本

命令大礼包,就是一个程序文件,包含若干行Linux命令语句

循环,条件语句

一般以.sh结尾,或者通过file命令查看,其类型是shell script

[root@luffy-001 log]# file /server/scripts/ip.sh
/server/scripts/ip.sh: Bourne-Again shell script text executable

创建Shell脚本

1、统一脚本存放目录,/server/scripts/

2、推荐使用vim编辑器编辑脚本,脚本以.sh结尾

3、第一行支出是由哪一个解释器来执行脚本中的内容

#!/bin/bash

/sbin/ifconfig eth0|awk -F '[ :]+' 'NR==2{print $4}'

#! 称为幻数,能被内核识别

必须写在第一行,如果不是第一行就编程脚本注释行

又可以写成#!/bin/sh

4、版权声明

# desc:     show  ip address
# author: pizza
# time: 20191111
# version: v1.0

5、题目:写一个简单的脚本(切换目录显示文件实行)并运行

3、shell脚本深入

变量

用一个固定的字符串,替代更多更复杂的内容,省事

x=1
[root@luffy-001 scripts]# x=1
[root@luffy-001 scripts]# echo $x
1
devPath=/server/
filelist=`ls`或者$(ls)
$LANG
$PATH

变量又分为局部变量(普通变量)、全局变量(环境变量)、特殊变量

局部变量(普通变量)

只能在创建他们Shell函数或者Shell脚本中使用

形式:变量名=value

变量名要求:
#1、字母、数字、下户线组成
#2、必须以字母开头
#3、见名知意,规范变量名写法定义
#4、驼峰写法:RedPizzaCar 应用变量尽量使用${}
[root@luffy-001 scripts]# week=10
[root@luffy-001 scripts]# echo ${week}day
10day
[root@luffy-001 scripts]# echo $weekday
#这样写什么也没有
[root@luffy-001 scripts]# 可以把一个命令作为变量
普通字符串via你来定义测试

全局变量(环境变量)

大写、linux里面哪里都可以用(常用的$PATH、$LANG、$PS1)

在创建他们的Shell及其派生出来的子Shell中使用

与普通变量的区别

注意:普通变量是无法直接调用的,需要使用export将其转化成全局变量后方能使用,例子见下面代码

[root@luffy-001 scripts]# vim pizza.sh
#!/bin/bash echo $PIZZA ~
~
~ "pizza.sh" 4L, 26C written
[root@luffy-001 scripts]# PIZZA=10
[root@luffy-001 scripts]# echo $PIZZA
10
[root@luffy-001 scripts]# sh pizza.sh [root@luffy-001 scripts]# export PIZZA
[root@luffy-001 scripts]# sh pizza.sh
10
[root@luffy-001 scripts]#

分类

1、Shell通过环境变量来确定登录用户名、命令路径、终端类型、登录目录(LANG、PATH、SHELL、UID)

2、自定义环境变量:

建议所有环境变量均为大写

必须用export命令定义

查看全局变量:env

取消全局变量:unset  PIZZA

与用户环境变量有关的文件目录...

与用户环境变量有关的文件目录

全局环境变量配置文件

/etc/profile

/etc/bashrc

/etc/profile.d/    用户登录到系统,会运行这个目录下面的脚本(脚本要有执行权限chmod +x)

用户环境变量配置文件

~/.bash_profile

~/.bashrc

特殊变量

位置变量

$0  获取当前执行脚本的文件名。如果执行脚本带路径,那么就包括脚本路径。模拟系统脚本使用$0

$n  n代表脚本后面的参数,

$#  脚本一共有多少个参数,参数的个数

进程状态变量

$? 显示上一个命令的执行结果

###命令执行正确  结果0

###命令执行错误  结果非0

变量赋值-如何向变量中放内容

1、直接给!

x=1
y=2
echo $x $y w=$1
s=$2
echo $w $s [root@luffy-001 scripts]# sh pizza.sh 10 20
10
1 2
10 20

2、read

[root@luffy-001 scripts]# read -p "input x y:" x y
input x y:10 20
[root@luffy-001 scripts]# echo $x $y
10 20

可以将该语句直接放入脚本中执行

read得到的输入默认存储在变量REPLY中

可以存储在一个或者多个变量中

-p  “提示语句”, 屏幕就会显示交互式语句

-t   等待时间

-s  关闭回显,用于密码输入

条件表达式

[ <测试表达式> ]注意两边要有空格

判断文件

-f 判断文件是否存在
[root@luffy-001 scripts]# [ -f /server/scripts/pizza.sh ]
[root@luffy-001 scripts]# echo $?
0
-d 判断目录是否存在
[root@luffy-001 scripts]# [ -d /server/scripts/ ]
[root@luffy-001 scripts]# echo $?
0

判断整数

等于equal                              -eq

不等于not equal                     -ne

大于 greater than                   -gt

大于等于 greater equal           -ge

小于less than                          -lt

小于等于 less equal                -le

[root@luffy-001 scripts]# [ 1 -eq 1 ]
[root@luffy-001 scripts]# echo $?
0

简单案例:判断命令行参数个数等于2(配合&&)

[ $# -eq 2 ]  && echo "arg:$#"

题目:如果/oldboy目录不存在则创建

[ -d /oldboy ] || mkdir -p /oldboy

题目:如果/root/oldboy.txt存在则提示文件已存在

[ -f /root/oldboy.txt ] && echo file esists

if条件语句

单分支条件语句

语法:if [条件];then 命令 fi

题目:如果第一个数比第二个数大,显示第一个数大于第而个数

num1=$1
num2=$2 if [ $num1 -gt $num2 ]; then
echo $num1 bigger than $num2
fi

多分支条件语句

语法:if [条件];then 命令 else 命令 fi

num1=$1
num2=$2 if [ $num1 -gt $num2 ]; then
echo $num1 bigger than $num2
elif [ $num1 -lt $num2 ]; then
  echo $num1 less than $num2
else
echo $num1 equal $num2
fi

现在有一个问题是这样的:如果参数过多,也会运行,后面多余的参数变成了无用参数,只有一个参数会报错

num1=$1
num2=$2 if [ $# -ne 2 ];then
echo "Usage:"please input 2 num : num1 num2
exit
fi if [ $num1 -gt $num2 ]; then
echo $num1 bigger than $num2
else
echo $num1 less than $num2
fi

[ -d /oldboy ]   相当于 test -d /oldboy

man test

for循环语句

语法格式:

for  变量名字  in  列表
do
  命令
done

例子:

[root@luffy-001 scripts]# for num in 1 2 3 4 5
> do
> echo "the num is:$num"
> done
the num is:1
the num is:2
the num is:3
the num is:4
the num is:5

生成序列seq 或者{}

[root@luffy-001 scripts]# for num in {1..10}; do echo "the num is:$num"; done
the num is:1
the num is:2
the num is:3
the num is:4
the num is:5
the num is:6
the num is:7
the num is:8
the num is:9
the num is:10

题目:优化linux开机启动项,只保留crond;sshd;network;rsyslog;sysstat,其他的都关闭

提示:chkconfig 服务  off

for name  in  $(chkconfig |egrep  "crond|sshd|rsyslog|network|sysstat" -v |awk '{print $1}')
do
chkconfig $name off
done

查看脚本执行过程 -x

题目:批量添加yoghurt并设置随机密码

初识shell编程的更多相关文章

  1. linux中的shell脚本编程---初识shell

    Shell是用户与Linux或Unix内核通信的工具,shell编程指的并不是编写这个工具,而是指利用现有的shell工具进行编程,写出来的程序是轻量级的脚本,我们叫做shell脚本. Shell的语 ...

  2. Shell脚本编程(一):初识shell script

    Shell简介 Shell是一个命令解释器,它是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核 ...

  3. 初识Shell与Shell脚本

    初识Shell Shell 是一个用 C 语言编写的程序,Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内 ...

  4. Linux基础入门(一)初识Shell

    Linux基础入门(一)初识Shell shell是什么 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell ...

  5. Linux学习笔记(17) Shell编程之基础

    1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...

  6. shell编程:定义简单标准命令集

    shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...

  7. Linux Shell编程入门

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  8. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  9. Linux_10------Linux之shell编程------变量

    .-9 vim num.sh #! /bin/bash num1=$1 num2=$2 sum=$(($num1+$num2)) #变量sum是num1和num2的综合 echo $sum 执行 ./ ...

随机推荐

  1. 《连连看》算法c语言演示(自动连连看)

    (图片是游戏的示意图,来自互联网,与本文程序无关) 看题目就知道是写给初学者的,没需要的就别看了,自己都觉得怪无聊的. 很多游戏的耐玩性都来自精巧的算法,特别是人工智能的水平.比如前几天看了著名的Al ...

  2. Python接口自动化

    1.unittest单元测试框架&接口介绍 2.接口测试框架设计 3.接口的安全机制 4.Mock服务介绍&实现原理 5.Jenkins使用和配置 6 .发送邮箱设置

  3. Chapter 4 Invitations——24

    "How do you do that?" I asked in amazed irritation. “你是怎么做到的?”我惊讶的问道. "Do what?" ...

  4. Unity3d之-使用BMFont制作美术字体

    一.需求 游戏开发中经常遇到需要以美术字(而非字库)做数字显示的情况,通常美术会提供一组包含单个数字(也会有其它字符)的图片,可能是一张整图,也可能是每个数字分开的散图. 在此我以一张整图这种情况为例 ...

  5. centos7修改网卡名字为传统名字

    前言:在centos6及其之前的系统中,我们已经习惯了网卡为eth0,eht1这种网卡命名方式,在centos7上网卡名字为ens33,ens37,ens38等名字,很别扭,想统一下网卡的命名. 1 ...

  6. Java提高班(五)深入理解BIO、NIO、AIO

    导读:本文你将获取到:同/异步 + 阻/非阻塞的性能区别:BIO.NIO.AIO 的区别:理解和实现 NIO 操作 Socket 时的多路复用:同时掌握 IO 最底层最核心的操作技巧. BIO.NIO ...

  7. mysql数据插入前判断是否存在

    今天在对一些抓取到的数据做插入的时候,因为使用了定时器,每间隔几分钟会抓取一次,导致很多数据插入的是重复数据,为了解决这个问题, 一般是在插入之前先通过一个标识去查询表数据看是否已经有了,没有再执行插 ...

  8. Nlog、Log4Net 的一个小扩展(增加自定义LEVEL)

    因公司ELK监控分析日志的需要,需要区分进程运行状态日志以及错误日志,以便能够根据日志级别(level)进行不同策略的预警,而现有的Nlog.Log4Net都没有Process这样的level,故针对 ...

  9. 一统江湖的大前端(2)—— Mock.js + Node.js 如何与后端潇洒分手

    <一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...

  10. JavaScript技巧(未完成)

    1.在js脚本语言中使用HTML语言中的< >号,但是在XHTML中却不能使用这类符号,可以将<号转换成&lt符号(XHTML比HTML跟严格),这种做法比较不好理解,可以用 ...