0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux從零到精通:最簡(jiǎn)單的Shell腳本入門教程

馬哥Linux運(yùn)維 ? 來源:運(yùn)維基地 ? 2024-12-05 09:56 ? 次閱讀

在數(shù)字化時(shí)代的浪潮中,Linux操作系統(tǒng)憑借其高效、穩(wěn)定、開源的特性,成為了無數(shù)開發(fā)者和系統(tǒng)管理員的首選。

而在Linux的龐大生態(tài)系統(tǒng)中,Shell編程無疑是連接用戶與系統(tǒng)內(nèi)核的橋梁,它讓我們能夠通過簡(jiǎn)單的命令和腳本,實(shí)現(xiàn)對(duì)系統(tǒng)的靈活控制和自動(dòng)化管理。

shell腳本前言

shell腳本入門

shell變量基礎(chǔ)

shell變量子串

shell數(shù)值運(yùn)算

條件表達(dá)式

流程控制語句

shell函數(shù)

case語句

shell變量數(shù)組

shell腳本前言

|為什么學(xué)習(xí)shell編程

Shell腳本語言是實(shí)現(xiàn)Linux/UNIX系統(tǒng)管理及自動(dòng)化運(yùn)維所必備的重要工具,Linux/UNIX系統(tǒng)的底層及基礎(chǔ)應(yīng)用軟件的核心大部分涉及Shell腳本的內(nèi)容

每一個(gè)合格的Linux系統(tǒng)管理員或運(yùn)維工程師,都需要熟練的編寫Shell腳本語言,并能夠閱讀系統(tǒng)及各類軟件附帶的Shell腳本內(nèi)容

只有這樣才能提升運(yùn)維人員的工作效率,適應(yīng)日益復(fù)雜的工作環(huán)境,減少不必要的重復(fù)工作,從而為個(gè)人的職場(chǎng)發(fā)展奠定較好的基礎(chǔ)

| 學(xué)好Shell編程所需的基礎(chǔ)知識(shí)

能夠熟練使用vim編輯器,熟悉SSH終端

有一定的Linux命令基礎(chǔ),至少需要掌握80個(gè)以上Linux常用命令,并能夠熟練使用它。

要熟練掌握Linux正則表達(dá)式及三劍客命令(grep,sed,awk)

| 如何學(xué)好Shel編程

學(xué)好Shel編程的核心:多練-->多思考-->再練-->再思考,堅(jiān)持如此循環(huán)即可!

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

格言:你覺得會(huì)了并不一定會(huì)了,你認(rèn)為對(duì)的并不一定對(duì)的。

大家要勤動(dòng)手,自行完成學(xué)習(xí)筆記和代碼的書寫。

shell腳本入門

|shell是什么?

Shell是一個(gè)命令解釋器,它在操作系統(tǒng)的最外層,負(fù)責(zé)直接與用戶對(duì)話,把用戶的輸入解釋給操作系統(tǒng),并處理各種各樣的操作系統(tǒng)的輸出結(jié)果,輸出屏幕返回給用戶

這種對(duì)話方式可以是:

交互的方式:從鍵盤輸入命令,通過/bin/bash的解釋器,可以立即得到shell的回應(yīng)

非交互的方式:腳本

|Shell能做什么?

安裝操作系統(tǒng):CentOS6.X和CentOS7.X 手動(dòng)方式安裝或克隆方式自動(dòng)化安裝:cobbler、kickstart 底層都是shell腳本實(shí)現(xiàn)

優(yōu)化 SSH:關(guān)閉Selinux 優(yōu)化防火墻,放行 80、443、SSH端口、zabbix監(jiān)控等服務(wù)訪問端口 個(gè)人需求:加大文件描述符、時(shí)間同步、硬件時(shí)間、軟件時(shí)間、YUM源等,都可以寫入shell腳本

安裝服務(wù) Nginx、Apache Tomcat、PHP、MySQL、Redis、Mongo、docker等例如:PHP5.4和PHP7.1寫入shell腳本,實(shí)現(xiàn)自動(dòng)化安裝不同版本的服務(wù)

代碼上線:shell腳本自動(dòng)化發(fā)布自動(dòng)化回滾

zabbix監(jiān)控:硬件、軟件、進(jìn)程、端口號(hào)、自定義監(jiān)控都可以通過shell腳本+定時(shí)任務(wù)完成

日志分析日志統(tǒng)計(jì):命令三劍客+定時(shí)任務(wù)+shell腳本來實(shí)現(xiàn)在ELK集群上的日志展示

業(yè)務(wù)層面

輔助開發(fā)程序:nohup和python的大量的日志處理

| 如何Shell編程

重點(diǎn)掌握前面的內(nèi)容:變量、判斷、bash,對(duì)它們徹底理解

先看懂,讀懂shell腳本

講完判斷,將前面學(xué)過的腳本進(jìn)行完善

自己寫簡(jiǎn)單的腳本,如一些小的項(xiàng)目:生活中:隨機(jī)點(diǎn)餐、大保健、會(huì)員辦理,消費(fèi)、服務(wù) 對(duì)應(yīng)價(jià)格不同 結(jié)賬 會(huì)員賬號(hào) 密碼 密碼丟失

有基本適合自己的教材,如:跟老男孩學(xué)習(xí)Shell編程或者完善的文檔

不能拿來及用,要搞懂、變成自己的,吸收了后可以解決企業(yè)中大部分的shell問題

一個(gè)shell腳本

# cat test.sh

#!/bin/bash

echo "Hello World!"

| 執(zhí)行腳本的三種常用的方式

(1)使用bash或者sh通過解釋器執(zhí)行腳本 在子shell中執(zhí)行命令

# sh test.sh

Hello World!

# bash test.sh

Hello World!

(2)使用路徑方式

全路徑執(zhí)行方式或者當(dāng)前路徑,必須給x權(quán)限

# 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的執(zhí)行方式

# cat test.sh | bash

Hello World!

# echo ls | bash

test.sh

# bash < test.sh

Hello World!

shell變量基礎(chǔ)

| 什么是變量

shell變量是一種很“弱”的變量,默認(rèn)情況下,一個(gè)變量保存一個(gè)串,shell不關(guān)心這個(gè)串是什么含義,所以若要進(jìn)行數(shù)學(xué)運(yùn)算,必須使用一些命令例如let、declare、expr、雙括號(hào)等。

shell變量可分為兩類:局部變量和環(huán)境變量

局部變量只在創(chuàng)建它們的shell中可用

環(huán)境變量則可以在創(chuàng)建它們的shell及其派生出來的任意子進(jìn)程中使用

有些變量是用戶創(chuàng)建的,其他的則是專用shell變量

變量名必須以字母或下劃線字符開頭,其余的字符可以是字母、數(shù)字(0~9)或下劃線字符

變量名字是大小寫敏感的,環(huán)境變量推薦設(shè)置為字母大寫

給變量賦值時(shí),等號(hào)周圍不能有任何空白符,為了給變量賦空值,可以在等號(hào)后跟一個(gè)換行符

變量刪除:用set命令可以查看所有的變量,unset var命令可以清除變量var,var相當(dāng)于沒有定義過

變量只讀:readonly var可以把var變?yōu)橹蛔x變量,定義之后不能對(duì)var進(jìn)行任何更改

對(duì)shell變量的引用方式很多,用這些方式可以方便的獲取shell變量的值,變量值的長(zhǎng)度,變量的一個(gè)字串,變量被部分替換后的值等等。

| 變量值的定義

字符串定義

# name=Iamlizhenya

# name='I am lizhenya'

# name="I am lizhenya"

# echo $name

I am lizhenya

雙引號(hào)和單引號(hào)的區(qū)別:雙引號(hào)解析變量,單引號(hào)所見即所得不能解析變量,不加引號(hào)可以解析變量

數(shù)字的定義

# age="12 23 432"

# echo $age

12 23 432

命令的定義

通過``調(diào)用命令

# 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

# 時(shí)間是固定 每次調(diào)用都相同

# echo $time

2022-07-07-18-02-40

通過$()調(diào)用命令

# 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

當(dāng)shell腳本中出現(xiàn)2條以上相同的命令就將它們寫成變量

| 核心位置變量

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

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

shell函數(shù)

函數(shù)是命令的集合 完成特定功能的代碼塊

函數(shù)代碼塊 方便復(fù)用

函數(shù)類似變量 只有先定義才能執(zhí)行

區(qū)別:變量不調(diào)用也會(huì)執(zhí)行 name=oldboy 函數(shù)只有調(diào)用才會(huì)執(zhí)行代碼

| 函數(shù)的定義

#!/bin/sh

fun1(){

echo "函數(shù)的第一種定義方式"

}

fun1

function fun2 {

echo "函數(shù)的第二種定義方式"

}

fun2

function fun3(){

echo "函數(shù)的第三種定義方式"

}

fun3

案例: 菜單

#!/bin/sh

fun1(){

echo -e " 1.包子"

echo -e " 2.麻辣燙"

echo -e " 3.小米粥"

echo -e " 4.漢堡"

echo -e " 5.燒烤"

}

fun1

| 函數(shù)復(fù)用

# cat 1.sh

#!/bin/bash

. /server/scripts/day4/test.sh

fun3

# sh 1.sh

函數(shù)的第三種定義方式

# cat test.sh

#!/bin/sh

fun1(){

echo "函數(shù)的第一種定義方式"

}

function fun2 {

echo "函數(shù)的第二種定義方式"

}

function fun3(){

echo "函數(shù)的第三種定義方式"

}

案例: 函數(shù)的傳參

函數(shù)調(diào)用在函數(shù)名稱的后面

fun1 參數(shù)1 參數(shù)2 參數(shù)3 對(duì)應(yīng)函數(shù)中的 $1 $2 $3

函數(shù)判斷文件是否存在

# 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 文件存在

函數(shù)可以識(shí)別變量

#!/bin/sh

file=$1

fun1(){

if [ -f $file ];then

echo "$file 文件存在"

else

echo "$file 文件不存在"

fi

}

fun1

# sh fun.sh /etc/hosts

/etc/hosts 文件存在

| 函數(shù)變量

可以識(shí)別全局變量 函數(shù)外的都是當(dāng)前shell的全局變量

只在函數(shù)內(nèi)生效的變量定義

# cat fun.sh

#!/bin/sh

fun1(){

local num=20

for i in `seq $num`

do

total=$[$count+$i]

done

echo "當(dāng)前運(yùn)算的結(jié)果是: $total"

}

fun1

echo $num

# sh fun.sh

當(dāng)前運(yùn)算的結(jié)果是: 20

函數(shù)的返回值return

# cat fun.sh

#!/bin/sh

fun1(){

echo 100

return 50

}

result=`fun1`

echo "當(dāng)前函數(shù)的返回值是: " $?

echo "當(dāng)前函數(shù)的執(zhí)行結(jié)果: " $result

# sh fun.sh

當(dāng)前函數(shù)的返回值是: 50

當(dāng)前函數(shù)的執(zhí)行結(jié)果: 100

利用返回值來判斷

錯(cuò)誤寫法

錯(cuò)誤寫法一:

#!/bin/sh

fun1(){

if [ -f $1 ];then

return 50

else

return 100

fi

}

fun1 $1

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

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

錯(cuò)誤寫法二:

#!/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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209499
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    365

    瀏覽量

    23374
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    389

    瀏覽量

    14865

原文標(biāo)題:Linux從零到精通:最簡(jiǎn)單的Shell腳本入門教程(附PDF)

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux Shell腳本入門實(shí)戰(zhàn)詳解

    Linux Shell腳本入門實(shí)戰(zhàn)詳解
    發(fā)表于 02-17 15:03 ?643次閱讀

    嵌入式Linux入門(五、Shell腳本編程上:認(rèn)識(shí)Shell腳本

    大家好,是矜辰所致,嵌入式 Linux入 門第五課,本課開始簡(jiǎn)單學(xué)習(xí)一下 Shell 腳本編程。
    的頭像 發(fā)表于 07-13 16:10 ?1627次閱讀
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>入門</b>(五、<b class='flag-5'>Shell</b><b class='flag-5'>腳本</b>編程上:認(rèn)識(shí)<b class='flag-5'>Shell</b><b class='flag-5'>腳本</b>)

    Linux shell腳本分享

    今天浩道跟大家分享幾個(gè)Linux運(yùn)維中常用到的shell腳本
    發(fā)表于 07-18 09:53 ?557次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>shell</b><b class='flag-5'>腳本</b>分享

    Ubuntu_Linux入門精通

    Ubuntu_Linux入門精通
    發(fā)表于 08-20 14:07

    shell編程入門精通

    shell編程入門精通。。
    發(fā)表于 11-02 09:00

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

    的思想。那么他就不可能理解開發(fā)人員的想法。其次,Linux不像windows,其涉及多方面的開發(fā),比如shell腳本,python自動(dòng)化運(yùn)維,php、js等等 都是可以幫助運(yùn)維人員更
    發(fā)表于 02-07 14:19

    入門精通Linux需學(xué)習(xí)的技能

    的思想。那么他就不可能理解開發(fā)人員的想法。其次,Linux不像windows,其涉及多方面的開發(fā),比如shell腳本,python自動(dòng)化運(yùn)維,php、js等等 都是可以幫助運(yùn)維人員更
    發(fā)表于 02-27 15:35

    Linux入門精通 高清版.

    本帖最后由 lee_st 于 2018-3-2 14:26 編輯 Linux入門精通 437頁 74.3M 高清版.
    發(fā)表于 03-01 15:55

    DSP入門精通全集

    DSP入門精通全集
    發(fā)表于 03-30 23:20 ?8487次下載

    nios入門精通

    nios入門精通
    發(fā)表于 07-08 16:55 ?0次下載

    Ubuntu入門精通

    《Ubuntu入門精通》Ubuntu一般是作為學(xué)習(xí)linux入門操作系統(tǒng),界面良好,現(xiàn)在已
    發(fā)表于 10-30 17:14 ?167次下載

    linux shell 腳本入門

    1. Linux 腳本編寫基礎(chǔ) 1.1 語法基本介紹 1.1.1 開頭 程序必須以下面的行開始(必須方在文件的第一行): #!/bin/sh 符號(hào)#!用來告訴系統(tǒng)它后面的參數(shù)是用來執(zhí)行該文件的程序
    發(fā)表于 11-07 15:44 ?11次下載

    如何創(chuàng)建和執(zhí)行一個(gè)簡(jiǎn)單Linux shell腳本

     如果您愿意要嘗試更長(zhǎng)的shell腳本,請(qǐng)將下面的shell腳本(并附加為PDF和ODT文件)復(fù)制文本編輯器中,保存,使其可執(zhí)行并運(yùn)行。當(dāng)
    的頭像 發(fā)表于 11-06 17:28 ?1.3w次閱讀

    Linux命令行與shell腳本編寫

    Linux命令行與shell腳本編寫
    發(fā)表于 01-11 16:50 ?4次下載

    Linux Shell腳本經(jīng)典案例分享

    ? 作為一名 Linux 運(yùn)維工程師,會(huì)寫好的腳本不僅能提高工作效率,還能有更多的時(shí)間做自己的事。最近在網(wǎng)上沖浪的時(shí)候,發(fā)現(xiàn)大家對(duì)Shell腳本都有“心結(jié)”,要么覺得自己寫出來不好
    發(fā)表于 06-16 14:03 ?651次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>Shell</b><b class='flag-5'>腳本</b>經(jīng)典案例分享