shell编程_第⼀篇_基础
shell基础
⼀编程与编程语⾔
Shell是⼀门编程语⾔,作为学习shell的开始,需要事先搞明⽩:编程的⽬的是什么?什么是编程语⾔?什么是编程?
1、编程的⽬的:
计算机的发明,是为了⽤机器取代/解放⼈⼒,⽽编程的⽬的则是将⼈类的思想流程按照某种能够被计算机识别的表达⽅式传递给计算机,从⽽达到让计算机能够像⼈脑/电脑⼀样⾃动执⾏的效果。
2、什么是编程语⾔?
上⾯提及的能够被计算机所识别的表达⽅式即编程语⾔,语⾔是沟通的介质,⽽编程语⾔是程序员与计算机沟通的介质。在编程的世界⾥,计算机更像是⼈的奴⾪,⼈类编程的⽬的就命令奴⾪去⼯作。
3、什么是编程?
编程即程序员根据需求把⾃⼰的思想流程按照某种编程语⾔的语法风格编写下来,产出的结果就是包含⼀堆字符的⽂件。
强调:程序在未运⾏前跟普通⽂件⽆异,只有程序在运⾏时,⽂件内所写的字符才有特定的语法意义
4、什么是程序
编程的结果就是程序,更准确点说,程序就是⼀系列代码⽂件
5、什么是进程
程序运⾏的过程就是进程,或者说是操作系统⼲活的过程,即操作系统拿着硬件去运⾏程序的过程
6、编程的步骤?
1、先把⾃⼰想让计算机做事的步骤想清楚
2、再⽤⼀种计算机可以听懂的语⾔把做事的步骤翻译下来
7、所以我有话对⼤家说
shell是语⾔,⽽学习语⾔的套路都是⼀样的,以英语学习为例,你需要学单词,然后学语法,最后写作⽂。
英语的单词---------->shell中的关键字
英语的语法---------->shell的语法
英语的作⽂---------->⽤shell语⾔写的程序
此时你⼼⾥应该有数了,学shell其实很简单,全都是在记忆⼀些固定的套路⽽已,那为何有的⼈会觉得shell难呢?来看⼀个普遍的问题,问题中包含答案。。。。。。
⼆编程语⾔分类
1、编程的语⾔的发展经历了
# 机器语⾔:站在计算机(奴⾪)的⾓度,说计算机能听懂的语⾔,那就是直接⽤⼆进制编程,直接操作硬件;
# 优点:执⾏效率最⾼
# 缺点:1、⼆进制指令难以记忆,开发时极容易出错
# 2、开发程序的复杂度⾼:即便是完成⼀个简单的功能,需要⽤到的⼆进制指令的条数都会⾮常多
# 汇编语⾔:站在计算机(奴⾪)的⾓度,简写的英⽂标识符取代⼆进制指令去编写程序,本质仍然是直接操作硬件;
# 优点:解决了机器语⾔的⼆进制指令难以记忆的问题,执⾏效率还是⾼
# 缺点:开发程序的复杂度依然很⾼:因为汇编语⾔就是⽤英⽂标签对应原来的⼆进制指令,好记归好记,开发
# 的复杂度却没有降低
ps:因为上述两类语⾔都是在直接与计算机硬件打交道,离计算机硬件⽐较近,所以⼜统称为低级语⾔
# ⾼级语⾔:站在⼈(奴⾪主)的⾓度,说⼈话,即⽤⼈类的字符去编写程序,屏蔽了硬件操作
# 优点:开发复杂度地,即开发效率⾼
# 缺点:速度肯定是不如低级语⾔,⼀直到今天,对速度要求极⾼的场景还会⽤到低级语⾔,⽐如操作系统的
# 调度程序
2、⾼级语⾔更贴近⼈类语⾔,因⽽造成了:它必须被翻译成计算机能读懂⼆进制后,才能被执⾏,按照翻译⽅式分为
# 1. 编译型(需要编译器,相当于⽤⾕歌翻译):如C,执⾏速度快,调试⿇烦
# 2. 解释型(需要解释器,相当于同声传译):如python,执⾏速度慢,调试⽅便
三计算机完整体系结构图
了解玩编程语⾔后,我们得知我们使⽤编程语⾔的⽬的在于与计算机对话,准确地说是命令计算机帮我们做事情,但编程语⾔⼜分类很多种,不同种类有不同的特点和难度,这对于学习者有不同的要求,⽐如对机器语⾔,要求学习者必须具备⾮常深厚的计算机硬件知识才可以使⽤它编写程序,⼀般等级⽐较低的⼈是没办法学会机器语⾔的!但我们⼤家伙虽然⽐较low,但我们也都想⽤⼀下计算机硬件,家⾥摆着⼀台机器能够帮我们做事情,就跟家⾥养了⼀个奴⾪⼀样,谁不想呢?
所以,为了⽅便不同的⼈都能够操作计算机硬件,有了⼀层⼀层封装的概念,如下图所⽰
四 shell介绍
1、shell有两层意思:
# 1、⼀层指的是shell这门语⾔,是⼀种特定的语法风格,规范等
# 2、另外⼀层指的是专门⽤于解释执⾏shell这门语⾔语法的应⽤程序,即shell解释器,我们常⽤的是bash
linux系统上⾃带多种shell解释器,⽆需安装
[root@localhost ~]# chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
通常⽤户登录成功后执⾏的shell程序为:/bin/bash
[root@localhost ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
shell本⾝就是⼀门解释型、弱类型、动态语⾔,与python相对应,Python属于解释型、强类型、动态语⾔,我们平时登录成功⼀个⽤户后进⼊的就是bash解释器的交互式环境,我们敲的命令其实都属于shell这门语⾔的语法
2、为何要⽤shell
那还⽤说吗,⼀些⽇常的运维⼯作⾃动化、配合计划任务威⼒⽆穷,彻底解放双⼿,你说它不⾹吗?例如
⾃动备份
⾃动部署
监控脚本
3、Shell VS python
shell语⾔
Shell 脚本的优势在于处理偏操作系统底层的业务,例如,Linux 内部的很多应⽤(有的是应⽤的⼀部分)都是使⽤ Shell 脚本开发的,因为有 1000 多个 Linux 系统命令为它作⽀撑,特别是 Linux 正则表达式以及三剑客 grep、awk、sed 等命令。
对于⼀些常见的系统脚本,使⽤ Shell 开发会更简单、更快速,例如,让软件⼀键⾃动化安装、优化,监控报警脚本,软件启动脚本,⽇志分析脚本等,虽然 Python 也能做到这些,但是考虑到掌握难度、开发效率、开发习惯等因素,它们可能就不如 Shell
python语⾔
Python 是近⼏年⾮常流⾏的语⾔,它不但可以⽤于脚本程序开发,也可以实现 Web 程序开发(知乎、⾖瓣、YouTube、Instagram 都是⽤ Python 开发),甚⾄还可以实现软件的开发(⼤名⿍⿍的 OpenStack、SaltStack 都是 Python 语⾔开发)、游戏开发、⼤数据开现在越来越多的公司要求运维⼈员会 Python ⾃动化开发,Python 也成了运维⼈员必备的技能,每⼀个运维⼈员在熟悉了 Shell 之
后,都应该再学习 Python 语⾔。
Python 语⾔的优势在于开发复杂的运维软件、Web 页⾯的管理⼯具和 Web 业务的开发(例如 CMDB ⾃动化运维平台、跳板机、批量管理软件 SaltStack、云计算OpenStack 软件)等。
shell最简单脚本五第⼀个shell程序
5.1 编写shell程序的两种环境
我们可以在两个地⽅编写shell程序
# 1、交互式环境
调试⽅便,⽆法永久保存代码
# 2、写到⽂件中
我们采⽤解释型语⾔编写的代码⽂件通常都会被称之为脚本程序(使⽤nodpad++演⽰):可以永久保存代码
5.2 编写shell脚本程序
其实我们在交互式环境⾥敲的命令直接放到⼀个⽂本⽂件⾥,⼀个简单的shell程序就完成了
强调:shell解释器执⾏程序是解释执⾏,即打开⽂件读内容,因此⽂件的后缀名没有硬性限制,但通常定义为.sh结尾
[root@xiaowu ~]# vim hello.sh
#!/bin/bash
#第⼀个shell⼩程序
echo "hello world"
解释
1、第⼀⾏表⽰我们选择使⽤的shell解释器是bash,也可以⽤:#!/usr/bin/env bash
shell的第⼀⾏⽐较特殊,⼀般都会以#!开始来指定使⽤的shell解释的类型。“#!”⼜叫做幻数,在执⾏脚本的时候,内核会根据幻数后⾯的内容来选择解释器,⽤以解释该脚本内容。
在linux中,除了bash shell以外,还有很多版本的shell,例如zsh、dash等等...
不过bash shell还是我们使⽤最多的。
2、第⼆⾏以#符号开始,表⽰本⾏是注释,注释是对代码的解释说明,注释的内容不会执⾏,对关键代码加注释是⼀种好的编程习惯
3、第三⾏中的echo是linux中的输出命令,该⾏的意思很明显的就是输出hello world!
精通各种语⾔的hello world!看⼀看还是⾼级语⾔的简洁
#C++
#include <iostream>
int main(void)
{
std::cout<<"Hello world";
}
#C
#include <stdio.h>
int main(void)
{
printf("\nhello world!");
return 0;
}
#JAVA
public class HelloWorld{
// 程序的⼊⼝
public static void main(String args[]){
// 向控制台输出信息
System.out.println("Hello World!");
}
}
#PHP
<?php
echo "hello world!";
>
#Ruby
⽇本⼈开发的,砸⽇本车的时候,顺⼿就把你拖出去打死了,祭天
puts "Hello world."
#GO
package main
import "fmt"
func main(){
fmt.Printf("Hello World!\n God Bless You!");
}
5.3 运⾏shell脚本程序
编写好shell脚本之后,运⾏它有⼏种⽅式
⽅式⼀:绝对路径,此时采⽤的是⽂件头指定的解释器来解释执⾏⽂件内代码
# 权限:
# 1、对沿途⽂件夹有x权限
# 2、对⽬标⽂件有r和x权限
# 例
[root@xiaowu ~]# ll -d /a
d--------x. 3 root root 15 11⽉ 15 11:05 /a
[root@xiaowu ~]# ll -d /a/b
d--------x. 2 root root 18 11⽉ 15 11:06 /a/b
[root@xiaowu ~]# ll /a/b/hello.sh
-rw-r--r-x. 1 root root 10 11⽉ 15 11:06 /a/b/hello.sh
[root@xiaowu ~]# su - xiaowu
[xiaowu@xiaowu ~]$ /a/b/hello.sh
hello world!
⽅式⼆:相对路径,需要加./作为前缀,此时采⽤的仍是⽂件头指定的解释器来解释执⾏⽂件内代码
# 权限:
# 1、对沿途⽂件夹有x权限
# 2、对⽬标⽂件有r和x权限
# 例
[root@xiaowu ~]# ll -d /a
d--------x. 3 root root 15 11⽉ 15 11:05 /a
[root@xiaowu ~]# ll -d /a/b
d--------x. 2 root root 18 11⽉ 15 11:06 /a/b
[root@xiaowu ~]# ll /a/b/hello.sh
-rw-r--r-x. 1 root root 10 11⽉ 15 11:06 /a/b/hello.sh
[root@xiaowu ~]# su - xiaowu
[xiaowu@xiaowu ~]$ /a/b/hello.sh # 绝对路径的⽅式
hello world!
[xiaowu@xiaowu ~]$ cd /a
[xiaowu@xiaowu /a]$ ./b/hello.sh # 相对路径的⽅式,加./作为前缀
hello world!
[xiaowu@xiaowu /a]$
⽅式三:解释器+⽂件路径(绝对路径或相对路径都可以),此时采⽤的是我们⾃⼰指定的解释器来解释执⾏⽂件内代码
# 权限:
# 1、对沿途⽂件夹有x权限
# 2、对⽬标⽂件有r权限即可
因为我们执⾏的是解释器,当前⽤户对解释有执⾏权限就可以了,这个权限默认就有,⽽解释器需要读⽂件内容来执⾏,所以需要对⽬标⽂件有r权限
# 例
[root@xiaowu ~]# chmod -R o=x /a
[root@xiaowu ~]# chmod o=r /a/b/hello.sh
[root@xiaowu ~]# su - egon
[xiaowu@xiaowu ~]$ cd /a
[xiaowu@xiaowu /a]$ bash b/hello.sh
hello world!
⽅式四:上述三种⽅式都是在⼦shell进程中执⾏程序,⽽⽅式四则是在当前shell进程中执⾏
# 权限:
# 1、对沿途⽂件夹有x权限
# 2、对⽬标⽂件有r权限即可
上述三种⽅式都是在当前shell环境下开启了⼀个新的shell解释器环境/⼦shell来执⾏程序,脚本程序在⼦shell中运⾏完毕后,⼦shell环境随即关闭,然后返回到⽗级shell即当前shell环境中,如果就想在当前shell环境中执⾏,需要这么做# 例如
[xiaowu@localhost shell]$ cd /home/egon/shell/
[xiaowu@localhost shell]$ ll hello.sh # 当前⽤户xiaowu对该⽂件没有执⾏权限
-rw-r--r--. 1 root root 60 8⽉ 14 18:33 hello.sh
# 下⾯两种⽅式都⼀样
[root@xiaowu ~]# chmod -R o=x /a
[root@xiaowu ~]# chmod o=r /a/b/hello.sh
[root@xiaowu ~]# su - egon
[xiaowu@xiaowu ~]$ . /a/b/hello.sh # . 后跟空格,然后再跟绝对路径
hello world!
[xiaowu@xiaowu ~]$ cd /a/b/
[xiaowu@xiaowu /a/b/a/b]$ . hello.sh # . 后跟空格,然后再跟相对路径
hello world!
[xiaowu@xiaowu /a/b/a/b]$ source hello.sh # 跟上述⽅式⼀样
hello world!
在当前shell解释器进程中执⾏脚本与在⼦shell进程中执⾏脚本的区别在于作⽤域,后续我们会详细介绍
# ⼀个shell环境就是⼀个单独的全局作⽤域,不同的shell环境,⽆法访问彼此shell环境中的变量
[root@xiaowu ~]# su - egon
[xiaowu@localhost ~]$ x=111
[xiaowu@localhost ~]$ cat /a/b/hello.sh
#!/bin/bash
echo "hello world!"
echo $x # 我们在这⾥访问⼀下全局变量x
[xiaowu@localhost ~]$ source /a/b/hello.sh # 在当前shell环境执⾏,可以访问到x
hello world!
111 # 取到了x的值
[xiaowu@localhost ~]$ bash /a/b/hello.sh # 在⼦shell环境执⾏,不能访问到x
hello world!
# 此处打印空
5.3 调试shell程序
调试⽅式1:以调试的⽅式运⾏
[root@xiaowu test]# sh -vx login.sh # 不加-v选项,只会显⽰程序中运⾏的代码,不会显⽰注释信息
调试⽅式2:只调试语法是否有问题,⽐如if判断少了fi结尾
[root@xiaowu test]# sh -n login.sh
调试⽅式3:仅调试脚本的⼀部分,⽤set -x与set +x包含,运⾏过程中会只打印它们包含的代码段的运⾏情况
[root@xiaowu test]# cat login.sh
#!/usr/bin/env bash
set -x
read -p "请输⼊您的名字: " name
read -p "请输⼊您的密码: " pwd
set +x
if [[ "$name" == "egon" && "$pwd" == "123" ]];then
echo "登录成功"
else
echo "账号或密码错误"
fi
[root@egon test]# . login.sh
5.4 注释是代码之母
井号#开头的内容不会执⾏,注释的作⽤有⼆
1、注释掉暂时不想运⾏的代码
2、为关键代码添加注解说明,增强程序的可读性和可维护性
1. 可以加在被注释代码的正上⽅单独⼀⾏,或者被注释代码的正后⽅,例如
# 注释。。。
echo "hello" # 注释。。。
2. 不⽤全部加注释,只需要在⾃⼰觉得重要或不好理解的部分加注释即可
3. 注释可以⽤中⽂或英⽂,但不要⽤拼⾳
六 shell编写规范与建议
⼀脚本编写规范
1、脚本存放⽬录需要统⼀
2、shell脚本的结尾以.sh
3、脚本开头要有解释器如#!/bin/bash 或者 #!/usr/bin/env bash
4、脚本开头注意加时间、作者、联系邮箱、脚本作⽤等信息
使⽤vimrc⽂件,可以快速的⽣成我们所需注释信息。
配置vimrc步骤:
挑选⼼仪模板⽂件(⽂章最后添加上了)
上传模板⽂件到~⽬录下(cd ~ 拖拽⽂件到shell)
修改模板注释信息(vim .vimrc)
call setline(5, "# Author: oldboy")
call setline(6, "# Organization: www.oldboyedu")
重新加载环境变量⽣效配置(断开shell连接重新连接)
验证⽣效(任意编辑⼀个***.sh⽂件,查看开头有⽆注释信息)
5、关键代码应该⽤#号加上注释
⼆代码编写好习惯
1、成对的符号尽量⼀次性写出来,防⽌遗漏
例如⼤括号{},中括号[],⼩括号(),单引号’’,双引号””,反引号``等
2、括号的保留空格习惯
中括号[ ]两端需要留有空格,不然会报错。书写时即可留出空格然后书写内容。
如果不知道⼤括号{},中括号[],⼩括号(),到底哪种括号需要两端留空格,可以在书写这些括号的时候两端都保留空格来进⾏书写,这样可以有效避免因空格导致的各种错误。
3、流程控制语句⼀次性书写完再添加内容
例1:if语句格式⼀次书写完成
if 条件内容
then
条件成⽴后执⾏的代码
fi
例2:for循环格式⼀次书写完成
for条件内容
do
条件成⽴后执⾏的代码
done
提⽰:while、until、case等语句也是⼀样
4、代码缩进提⾼可读性
5、常⽤脚本执⾏⽅法:sh source
sh 与 source 执⾏脚本的区别
sh 新建⼀个⼦shell执⾏脚本
source 在当前shell执⾏脚本
⾯试题:已知:test.sh脚本内容(如下所⽰),请问在⽤sh执⾏脚本后echo $a返回结果是___空___?
#!/bin/bash
a=1
echo $a
vimrc内容
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论