0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux从零到精通:最简单的Shell脚本入门教程

马哥Linux运维 来源:运维基地 2024-12-05 09:56 次阅读

在数字化时代的浪潮中,Linux操作系统凭借其高效、稳定、开源的特性,成为了无数开发者和系统管理员的首选。

而在Linux的庞大生态系统中,Shell编程无疑是连接用户与系统内核的桥梁,它让我们能够通过简单的命令和脚本,实现对系统的灵活控制和自动化管理。

shell脚本前言

shell脚本入门

shell变量基础

shell变量子串

shell数值运算

条件表达式

流程控制语句

shell函数

case语句

shell变量数组

shell脚本前言

|为什么学习shell编程

Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚本的内容

每一个合格的Linux系统管理员或运维工程师,都需要熟练的编写Shell脚本语言,并能够阅读系统及各类软件附带的Shell脚本内容

只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础

| 学好Shell编程所需的基础知识

能够熟练使用vim编辑器,熟悉SSH终端

有一定的Linux命令基础,至少需要掌握80个以上Linux常用命令,并能够熟练使用它。

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

| 如何学好Shel编程

学好Shel编程的核心:多练-->多思考-->再练-->再思考,坚持如此循环即可!

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

格言:你觉得会了并不一定会了,你认为对的并不一定对的。

大家要勤动手,自行完成学习笔记和代码的书写。

shell脚本入门

|shell是什么?

Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出屏幕返回给用户

这种对话方式可以是:

交互的方式:从键盘输入命令,通过/bin/bash的解释器,可以立即得到shell的回应

非交互的方式:脚本

|Shell能做什么?

安装操作系统:CentOS6.X和CentOS7.X 手动方式安装或克隆方式自动化安装:cobbler、kickstart 底层都是shell脚本实现

优化 SSH:关闭Selinux 优化防火墙,放行 80、443、SSH端口、zabbix监控等服务访问端口 个人需求:加大文件描述符、时间同步、硬件时间、软件时间、YUM源等,都可以写入shell脚本

安装服务 Nginx、Apache Tomcat、PHP、MySQL、Redis、Mongo、docker等例如:PHP5.4和PHP7.1写入shell脚本,实现自动化安装不同版本的服务

代码上线:shell脚本自动化发布自动化回滚

zabbix监控:硬件、软件、进程、端口号、自定义监控都可以通过shell脚本+定时任务完成

日志分析日志统计:命令三剑客+定时任务+shell脚本来实现在ELK集群上的日志展示

业务层面

辅助开发程序:nohup和python的大量的日志处理

| 如何Shell编程

重点掌握前面的内容:变量、判断、bash,对它们彻底理解

先看懂,读懂shell脚本

讲完判断,将前面学过的脚本进行完善

自己写简单的脚本,如一些小的项目:生活中:随机点餐、大保健、会员办理,消费、服务 对应价格不同 结账 会员账号 密码 密码丢失

有基本适合自己的教材,如:跟老男孩学习Shell编程或者完善的文档

不能拿来及用,要搞懂、变成自己的,吸收了后可以解决企业中大部分的shell问题

一个shell脚本

# cat test.sh

#!/bin/bash

echo "Hello World!"

| 执行脚本的三种常用的方式

(1)使用bash或者sh通过解释器执行脚本 在子shell中执行命令

# sh test.sh

Hello World!

# bash test.sh

Hello World!

(2)使用路径方式

全路径执行方式或者当前路径,必须给x权限

# chmod +x test.sh

# /server/scripts/test.sh

Hello World!

# ./test.sh

Hello World!

(3)使用source或者 . 的方式

# . test.sh

Hello World!

# source test.sh

Hello World!

(4)其他shell的执行方式

# cat test.sh | bash

Hello World!

# echo ls | bash

test.sh

# bash < test.sh

Hello World!

shell变量基础

| 什么是变量

shell变量是一种很“弱”的变量,默认情况下,一个变量保存一个串,shell不关心这个串是什么含义,所以若要进行数学运算,必须使用一些命令例如let、declare、expr、双括号等。

shell变量可分为两类:局部变量和环境变量

局部变量只在创建它们的shell中可用

环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用

有些变量是用户创建的,其他的则是专用shell变量

变量名必须以字母或下划线字符开头,其余的字符可以是字母、数字(0~9)或下划线字符

变量名字是大小写敏感的,环境变量推荐设置为字母大写

给变量赋值时,等号周围不能有任何空白符,为了给变量赋空值,可以在等号后跟一个换行符

变量删除:用set命令可以查看所有的变量,unset var命令可以清除变量var,var相当于没有定义过

变量只读:readonly var可以把var变为只读变量,定义之后不能对var进行任何更改

对shell变量的引用方式很多,用这些方式可以方便的获取shell变量的值,变量值的长度,变量的一个字串,变量被部分替换后的值等等。

| 变量值的定义

字符串定义

# name=Iamlizhenya

# name='I am lizhenya'

# name="I am lizhenya"

# echo $name

I am lizhenya

双引号和单引号的区别:双引号解析变量,单引号所见即所得不能解析变量,不加引号可以解析变量

数字的定义

# age="12 23 432"

# echo $age

12 23 432

命令的定义

通过``调用命令

# date +%F-%H-%M-%S

2022-07-07-18-02-34

# time=`date +%F-%H-%M-%S`

# echo $time

2022-07-07-18-02-40

# 时间是固定 每次调用都相同

# echo $time

2022-07-07-18-02-40

通过$()调用命令

# time=$(date +%F-%H-%M-%S)

# echo $time

2022-07-07-18-02-52

| 变量可以定义变量

# ip=`ifconfig eth0|awk 'NR==2{print $2}'`

# echo $ip

10.0.0.7

# dir=${ip}_${time}

# echo $dir

10.0.0.7_2022-07-07-18-11-34

当shell脚本中出现2条以上相同的命令就将它们写成变量

| 核心位置变量

ebf9d0b2-ad2a-11ef-93f3-92fbcf53809c.png

echo hehe...........

shell函数

函数是命令的集合 完成特定功能的代码块

函数代码块 方便复用

函数类似变量 只有先定义才能执行

区别:变量不调用也会执行 name=oldboy 函数只有调用才会执行代码

| 函数的定义

#!/bin/sh

fun1(){

echo "函数的第一种定义方式"

}

fun1

function fun2 {

echo "函数的第二种定义方式"

}

fun2

function fun3(){

echo "函数的第三种定义方式"

}

fun3

案例: 菜单

#!/bin/sh

fun1(){

echo -e " 1.包子"

echo -e " 2.麻辣烫"

echo -e " 3.小米粥"

echo -e " 4.汉堡"

echo -e " 5.烧烤"

}

fun1

| 函数复用

# cat 1.sh

#!/bin/bash

. /server/scripts/day4/test.sh

fun3

# sh 1.sh

函数的第三种定义方式

# cat test.sh

#!/bin/sh

fun1(){

echo "函数的第一种定义方式"

}

function fun2 {

echo "函数的第二种定义方式"

}

function fun3(){

echo "函数的第三种定义方式"

}

案例: 函数的传参

函数调用在函数名称的后面

fun1 参数1 参数2 参数3 对应函数中的 $1 $2 $3

函数判断文件是否存在

# cat fun.sh

#!/bin/sh

fun1(){

if [ -f $1 ];then

echo "$1 文件存在"

else

echo "$1 文件不存在"

fi

}

fun1 /etc/hosts

# sh fun.sh

/etc/hosts 文件存在

# cat fun.sh

#!/bin/sh

fun1(){

if [ -f $3 ];then

echo "$3 文件存在"

else

echo "$3 文件不存在"

fi

}

fun1 /etc/hosts /etc/passwd /etc/fsttttttt

# sh fun.sh

/etc/fsttttttt 文件不存在

# cat fun.sh

#!/bin/sh

fun1(){

if [ -f $1 ];then

echo "$1 文件存在"

else

echo "$1 文件不存在"

fi

}

fun1 $2

# sh fun.sh /etc/passwd /etc/hosts

/etc/hosts 文件存在

函数可以识别变量

#!/bin/sh

file=$1

fun1(){

if [ -f $file ];then

echo "$file 文件存在"

else

echo "$file 文件不存在"

fi

}

fun1

# sh fun.sh /etc/hosts

/etc/hosts 文件存在

| 函数变量

可以识别全局变量 函数外的都是当前shell的全局变量

只在函数内生效的变量定义

# cat fun.sh

#!/bin/sh

fun1(){

local num=20

for i in `seq $num`

do

total=$[$count+$i]

done

echo "当前运算的结果是: $total"

}

fun1

echo $num

# sh fun.sh

当前运算的结果是: 20

函数的返回值return

# cat fun.sh

#!/bin/sh

fun1(){

echo 100

return 50

}

result=`fun1`

echo "当前函数的返回值是: " $?

echo "当前函数的执行结果: " $result

# sh fun.sh

当前函数的返回值是: 50

当前函数的执行结果: 100

利用返回值来判断

错误写法

错误写法一:

#!/bin/sh

fun1(){

if [ -f $1 ];then

return 50

else

return 100

fi

}

fun1 $1

[ $? -eq 50 ] && echo "文件存在"

[ $? -eq 100 ] && echo "文件不存在"

错误写法二:

#!/bin/sh

fun1(){

if [ -f $1 ];then

return 50

else

return 100

fi

}

fun1 $1

if [ $? -eq 50 ];then

echo 文件存在

elif [ $? -eq 100 ];then

echo 文件不存在

fi

解决方法:

[ $? -eq 50 ] && echo 文件存在 || echo 文件不存在

if [ $? -eq 50 ];then

echo 文件存在

else

echo 文件不存在

fi

赋值的方式

re=$?

if [ $re -eq 50 ];then

echo 文件存在

elif [ $re -eq 100 ];then

echo 文件不存在

fi

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11259

    浏览量

    209172
  • Shell
    +关注

    关注

    1

    文章

    365

    浏览量

    23337
  • 脚本
    +关注

    关注

    1

    文章

    389

    浏览量

    14853

原文标题:Linux从零到精通:最简单的Shell脚本入门教程(附PDF)

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux Shell脚本入门实战详解

    Linux Shell脚本入门实战详解
    发表于 02-17 15:03 632次阅读

    嵌入式Linux入门(五、Shell脚本编程上:认识Shell脚本

    大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程。
    的头像 发表于 07-13 16:10 1603次阅读
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>入门</b>(五、<b class='flag-5'>Shell</b><b class='flag-5'>脚本</b>编程上:认识<b class='flag-5'>Shell</b><b class='flag-5'>脚本</b>)

    Linux shell脚本分享

    今天浩道跟大家分享几个Linux运维中常用到的shell脚本
    发表于 07-18 09:53 553次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>shell</b><b class='flag-5'>脚本</b>分享

    Ubuntu_Linux入门精通

    Ubuntu_Linux入门精通
    发表于 08-20 14:07

    shell编程入门精通

    shell编程入门精通。。
    发表于 11-02 09:00

    Linux入门精通需要掌握什么?

    的思想。那么他就不可能理解开发人员的想法。其次,Linux不像windows,其涉及多方面的开发,比如shell脚本,python自动化运维,php、js等等 都是可以帮助运维人员更
    发表于 02-07 14:19

    入门精通Linux需学习的技能

    的思想。那么他就不可能理解开发人员的想法。其次,Linux不像windows,其涉及多方面的开发,比如shell脚本,python自动化运维,php、js等等 都是可以帮助运维人员更
    发表于 02-27 15:35

    Linux入门精通 高清版.

    本帖最后由 lee_st 于 2018-3-2 14:26 编辑 Linux入门精通 437页 74.3M 高清版.
    发表于 03-01 15:55

    DSP入门精通全集

    DSP入门精通全集
    发表于 03-30 23:20 8478次下载

    nios入门精通

    nios入门精通
    发表于 07-08 16:55 0次下载

    Ubuntu入门精通

    《Ubuntu入门精通》Ubuntu一般是作为学习linux入门操作系统,界面良好,现在已
    发表于 10-30 17:14 167次下载

    linux shell 脚本入门

    1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序
    发表于 11-07 15:44 11次下载

    如何创建和执行一个简单Linux shell脚本

     如果您愿意要尝试更长的shell脚本,请将下面的shell脚本(并附加为PDF和ODT文件)复制文本编辑器中,保存,使其可执行并运行。当
    的头像 发表于 11-06 17:28 1.3w次阅读

    Linux命令行与shell脚本编写

    Linux命令行与shell脚本编写
    发表于 01-11 16:50 4次下载

    Linux Shell脚本经典案例分享

    ​ 作为一名 Linux 运维工程师,会写好的脚本不仅能提高工作效率,还能有更多的时间做自己的事。最近在网上冲浪的时候,发现大家对Shell脚本都有“心结”,要么觉得自己写出来不好
    发表于 06-16 14:03 645次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>Shell</b><b class='flag-5'>脚本</b>经典案例分享