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

云游道人 2024-12-01 2401 阅读 1评论
在数字化时代的浪潮中,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是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出屏幕返回给用户
  • 这种对话方式可以是:
    1. 交互的方式:从键盘输入命令,通过/bin/bash的解释器,可以立即得到shell的回应
    2. 非交互的方式:脚本

| Shell能做什么?

  1. 安装操作系统:CentOS6.X和CentOS7.X 手动方式安装或克隆方式自动化安装:cobbler、kickstart 底层都是shell脚本实现
  2. 优化 SSH:关闭Selinux 优化防火墙,放行 80、443、SSH端口、zabbix监控等服务访问端口
    个人需求:加大文件描述符、时间同步、硬件时间、软件时间、YUM源等,都可以写入shell脚本
  3. 安装服务 Nginx、Apache Tomcat、PHP、MySQL、Redis、Mongo、docker等例如:PHP5.4和PHP7.1写入shell脚本,实现自动化安装不同版本的服务
  4. 代码上线:shell脚本自动化发布自动化回滚
  5. zabbix监控:硬件、软件、进程、端口号、自定义监控都可以通过shell脚本+定时任务完成
  6. 日志分析日志统计:命令三剑客+定时任务+shell脚本来实现在ELK集群上的日志展示
  7. 业务层面
  8. 辅助开发程序:nohup和python的大量的日志处理

| 如何Shell编程

  1. 重点掌握前面的内容:变量、判断、bash,对它们彻底理解
  2. 先看懂,读懂shell脚本
  3. 讲完判断,将前面学过的脚本进行完善
  4. 自己写简单的脚本,如一些小的项目:生活中:随机点餐、大保健、会员办理,消费、服务 对应价格不同 结账 会员账号 密码 密码丢失
  5. 有基本适合自己的教材,如:跟老男孩学习Shell编程或者完善的文档
  6. 不能拿来及用,要搞懂、变成自己的,吸收了后可以解决企业中大部分的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 $nameI am lizhenya

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

数字的定义

# age="12 23 432"# echo $age12 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条以上相同的命令就将它们写成变量

| 核心位置变量



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

shell函数

  1. 函数是命令的集合  完成特定功能的代码块
  2. 函数代码块 方便复用
  3. 函数类似变量 只有先定义才能执行  

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

| 函数的定义

#!/bin/sh

fun1(){

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

}

fun1


function fun2 {

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

}

fun2


function fun3(){

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

}

fun3

案例: 菜单

#!/bin/sh
fun1(){
    echo -e "\t\t\t\t1.包子"
    echo -e "\t\t\t\t2.麻辣烫"
    echo -e "\t\t\t\t3.小米粥"
    echo -e "\t\t\t\t4.汉堡"
    echo -e "\t\t\t\t5.烧烤"
}
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/shfile=$1fun1(){   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


来源:运维基地,版权归原作者所有,如有侵权,请联系我们修改或删除。

喜欢就支持以下吧
点赞 0

发表评论

快捷回复: 表情:
aoman baiyan bishi bizui cahan ciya dabing daku deyi doge fadai fanu fendou ganga guzhang haixiu hanxiao zuohengheng zhuakuang zhouma zhemo zhayanjian zaijian yun youhengheng yiwen yinxian xu xieyanxiao xiaoku xiaojiujie xia wunai wozuimei weixiao weiqu tuosai tu touxiao tiaopi shui se saorao qiudale qinqin qiaoda piezui penxue nanguo liulei liuhan lenghan leiben kun kuaikule ku koubi kelian keai jingya jingxi jingkong jie huaixiao haqian aini OK qiang quantou shengli woshou gouyin baoquan aixin bangbangtang xiaoyanger xigua hexie pijiu lanqiu juhua hecai haobang caidao baojin chi dan kulou shuai shouqiang yangtuo youling
提交
评论列表 (有 1 条评论, 2401人围观)

最近发表

热门文章

最新留言

热门推荐

标签列表