Shell - day01

一、Shell 入门

1.1 什么是shell?

Shell其实是一个命令解释器,作用是解释执行用户输入的命令以及程序等,用户每输入一条命令,Shell给予解释执行一条。这种键盘一输入命令,就可以立即得到回应的对话方式,称为交互模式。

Shell存在于操作系统的最外层,负责与用户直接对话。处理用户的输入,并将操作系统执行结果返回给用户。在用户登陆到操作系统之后的所有操作均由Shell解释执行。Shell在操作系统中所处的位置如下

image-20191026173305174.png

1.2 什么是shell 脚本

简言之,如果shell命令通过写入到一个程序文件并执行的时候,此程序我们就称之为shell脚本。
但是在生产环境中的Shell脚本不仅仅是这么简单,而是将一些命令、变量以及流程控制语句有机结合并生成的功能完善的强大的应用程序。

举例说明:

  • 清除/var/log下message日志文件简单脚本
cat /dev/null > /var/log/messages
  • 生产环境中清除/var/log 下 message 的脚本
#!/bin/bash
# 清除日志脚本,版本 2 
LOG_DIR=/var/log
# 脚本需要使用root用户权限来执行,因此,对当前用户进行判断,则不和要求的用户给出友好提示,并终止程序执行
ROOT_UID=0
if [ "$UID" -ne "$ROOT_UID" ] # <== 如果当前用户不是root,则不允许执行脚本
  then
    echo "Must be root to run this script." # <== 给出提示后退出
    exit 1
fi
# 如果切换目录不成功,则给出提示并中止程序执行
cd $LOG_DIR || {
    echo "Cannot change to necessary directory."
    exit 1
}
# 经过上述判断之后,此处的用户权限应该是对的了,只有清空成功,再能打印成功提示
cat /dev/null >messages &&{
    echo "Logs cleaned up."
    exit 0    # 返回0则成功
}
echo "Logs cleaned up fail."
exit 1        # 返回1则失败

1.3 什么时候使用shell脚本?

  • Linux批量管理
  • 自动化完成系统优化
  • 自动化安装Linux操作系统(kickstart 和 cobbler)
  • 测试工具和内容自动化
  • 邮件自动发送
  • 服务自动重启
  • 代码上线
  • 定时备份和定时启停服务
  • Linux 系统监控、服务监控、端口监控、IP黑名单监控、流量监控等
  • 服务的日志切割、存储备份、日志分析等等

1.4 如何学好 shell 脚本

基础变量、条件表达式、流程判断、if、for循环、while循环、case语句、循环控制

  • 从简单的判断和循环开始写
  • 阅读、模仿、尝试从零开始写
  • 写注释,将任务分解成一个个小任务,类似于打游戏闯关
  • 找一本合适的教材,或者自己认真记笔记
  • 多练习-思考-练习-思考,循环往复

1.5 解释型语言和编译型语言

编译型语言

指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码,这个过程叫做编译。
编译好的可执行文件(.exe),可在相对应的平台运行(移植性差,但是效率高)。
如:C\C++.....

解释型语言

用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言,相当于把编译型语言的编译执行过程混合在一起同时完成的。
编译型语言执行效率较低,切不能脱离解释器运行。但是跨平台比较容易,只需提供相应的解释器
如:shell\python

注:Java属于特殊的。既可以说成是解释型语言,又可以说成是编译型语言

1.6 shell脚本建立和执行

解释器类型

bash是centos中的默认解释器

脚本定义

脚本开头
#!/bin/bash

父shell和子shell

  • 父shell中的环境变量,在子shell中可以看到
  • 而子shell中的变量,在父shell中看不到

shell执行方式

sh & bash           # 最常用的使用方式
cat *.sh | bash     # 适用于执行多个脚本
sh < test.sh        # 了解一下,输入重定向
/root/test.sh       # 需要执行权限
.  test.sh
source test.sh

1.5 shell开发习惯

  • 脚本存放在固定目录
  • 开头加脚本解释器信息
  • 附带作者和版权信息
  • 脚本中尽量不用中文
  • 脚本扩展名用.sh
  • 成对的符号一次性书写完成
  • 注意缩进
  • 养成写注释的良好习惯

二、变量基础

2.1 定义变量

值可变的亮,称之为变量
变量名=变量值,常说的变量,一般是变量名
变量的组成:字母数字下划线,但是不能以数字开头

2.2 环境变量和普通变量

环境变量 (全局变量)

可在创建他们的shell一级派生出来的任意子shell中使用

<font color=#FF0000 >环境变量包括内置的环境变量和自定义的环境变量</font>

环境变量的定义方式

declare -x  变量名=value
export 变量名=value   # 常用

环境变量有四个文件,他们的执行属于如下图所示


image-20191026205901959.png
  • 登陆shell会加载所有的环境变量
  • 非登陆shell可能会加载~/.bashrc或者/etc/bashrc(上图非绿色部分),然而有些定时任务以上两个根本不会加载,所以需要手动指定,建议在定义变量时定义到/etc/bashrc
  • 可以在环境变量文件中定义普通变量

普通变量

普通变量只能在当前shell 中使用
普通变量的定义方式

 # 适用于一般场景,不适用于带有空格等字符
变量名=value
# 所见即所得的定义方式
变量名='value'
# 解析双引号之内的变量
变量名='value'

2.3 临时变量和永久变量

如果按照变量的生存周期来划分的话,Linux变量可以分为两类:

  • 永久变量:需要修改变量配置文件,使得变量永久生效
  • 临时变量:使用export命令或者直接在当前 shell 中赋值的变量

2.4 shell 特殊变量

参数特殊变量

特殊变量 作用说明
$0 获取当前执行shell脚本文件名,如果执行脚本带路径,则包括完整路径
$n 获取当前执行shell脚本的第n个参数值,若n>9,则用大括号包裹,如${10}
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。

进程特殊变量

特殊变量 作用说明
$? 显示最后命令的退出状态。0表示没有错误,非0表明有错误。此变量最常用
$$ 显示脚本运行的当前进程ID号,此变量不常用,了解即可
$! 后台运行的最后一个进程的ID号,此变量不常用,了解即可
$_ 之前运行脚本的最后一个参数,此变量最不常用,了解即可

2.5 shell 变量字串

表达式 作用说明
${param} 返回变量$param内容
${#param} 返回变量$param内容的字符长度,也适合特殊变量,此表达式最常用
${param:offset} 在变量$param中,从位置offset之后开始提取子串到结尾
${param:offset:length} 在变量$param中,从位置offset之后开始提取长度为length的子串
${param#word} 在变量$param开头删除最短匹配的word子串
${param##word} 在变量$param开头删除最长匹配的word子串
${param%word} 在变量$param结尾删除最短匹配的word子串
${param%%word} 在变量$param结尾删除最长匹配的word子串
${param/pattern/string} 将变量$param中符合pattern的第一个内容用string取代
${param//pattern/string} 将变量$param中符合pattern的所有内容用string取代

2.6 变量数值计算

算数运算符

算术运算符 说明(*表示常用)
+、- 加法(或正号)、减法(或负号)*
*、/、% 乘法、除法、取余(也称取模)*
** 幂运算*
++、-- 自增、自减,默认步长为1*
!、&&、|| 逻辑非(取反)、逻辑与(and)、逻辑或(or)*
<、<=、>、>= 比较符号(小于、小于等于、大于、大于等于)*
==、!=、= 比较符号(等于、不等于、对于字符串“=”也表示等于)*
<<、>> 向左移位、向右移位
~、|、&、^ 按位取反、按位异或、按位与、按位或
=、+=、-=、*=、/=、%= 等号为赋值运算符,例如a+=1相当于a=a+1*

Shell的常见运算命令

运算命令 说明(*表示常用)
(()) 用于整数运算命令,效率很高*
let 用于整数运算命令,类似于(())*
expr 命令行计数器,一般用于整数值,也可用于字符串。
$[] 用于整数运算命令
declare 定义变量值和属性,-i参数可定义整型变量,做运算
bc Linux下的计算器程序(可用于整数以及小数运算)
awk 可用于整数以及小数运算 *

2.7 变量传参

脚本变量传参的三种方式:

  • 直接赋值
[one@shell ~]$ cat 1.sh 
IP=127.0.0.1
echo $IP

[one@shell ~]$ sh 1.sh 
127.0.0.1
  • 传参方式
[one@shell ~]$ cat 1.sh 
IP=$1
echo $IP
[one@shell ~]$ sh 1.sh 127.0.0.1
127.0.0.1
  • read方式
[one@shell ~]$ cat 1.sh 
read -p "请输入一个参数: " IP
echo $IP
[one@shell ~]$ sh 1.sh 
请输入一个参数: 127.0.0.1
127.0.0.1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351