shell腳本簡介

来源:https://www.cnblogs.com/yinshoucheng-golden/archive/2018/07/26/9369603.html
-Advertisement-
Play Games

什麼是shell? shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕返回給用戶。這種對話方式可以是交互的方式(從鍵盤輸入命令,可以立即得到shell的回應),或非交互(執行腳本程式)的方式。下圖的黃色部分... ...


什麼是shell


shell
是一個命令解釋器,它在操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕返回給用戶。這種對話方式可以是交互的方式(從鍵盤輸入命令,可以立即得到shell的回應),或非交互(執行腳本程式)的方式。
下圖的黃色部分就是命令解釋器shell處於的操作系統中位置形象圖解。

 

什麼是shell腳本?


linux命令或語句不在命令下執行(嚴格說,命令行執行的語句也是shell腳本),而是通過一個程式文件執行時,該程式就被稱為shell腳本或shell程式,shell程式很類似DOS系統下的批處理程式(擴展名*.bat)。用戶可以在shell腳本中敲入一系列的命令或命令語句組合。這些命令、變數和流程式控制制語句等有機的結合起來就形成了一個功能很強大的shell腳本。
下麵是在windows下利用批處理程式bat開發的備份網站及資料庫數據的腳本。
@echo off
set date=%date:`0,4%-%date:`5,2%-%date:`8,2%
mysqldump -uroot -poldboy -A -B > D:\bak\"%date%".sql
rar.exe a -k -r -s -ml D:\bak\"%date%".sql.rar D:\bak\"%date%".sql
del D:\bak\*.sql
rar.exe a -k -r -s -ml D:\bak\"%date%"htdocs.rar D:\work\htdocs
示例1:清除/var/logmessages日誌文件的簡單命令腳本。
#
把所有命令放在一個文件里堆積起來就形成了腳本,下麵是一個最簡單的命令堆積形成的shell腳本
#root
身份運行
#
清楚日誌
cd /var/log
cat /dev/null > messages
echo "Logs cleaned up."
上述腳本存在如下問題:
1
、如果不是root用戶無法執行清理日誌。
2
、無流程式控制制語句,沒有判斷和邏輯。
示例2:包含命令、變數和流程式控制制語句的清除/var/logmessages日誌文件的shell腳本。
#!/bin/bash
#
清除日誌腳本
LOG_DIR=/var/log
ROOT_UID=0 #$UID
0的時候,用戶才具有root用戶的許可權
#
使用root運行
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Mast be root to run this script."
exit 1
fi
cd $LOG_DIR || {
echo "Cannot change to necessary directory." >&2
exit 1 
}
cat /dev/null > messages && echo "Logs cleaned up."
exit 0
#
退出之前返回0表示成功,返回1表示失敗。
拓展:清空日誌及文件內容的三種方法。
[root@lamp ~]# echo >test.log
[root@lamp ~]# >test.log 
[root@lamp ~]# cat /dev/null > test.log 

shell腳本在運維工作中的地位


shell
腳本很擅長處理純文本類型的數據,而linux系統中幾乎所有的配置文件(如nfsrsynchttpdnginxlvs等)、多數啟動文件都是純文本類型的文件。因此利用shell可以在linux系統中發揮巨大作用。

shell腳本語言的種類


UNIX/LINUX中主要有兩大類shell
Bourne shell
包括shkshbash
Bourne shell
sh
Korn shell
ksh
Bourne Again shell
bash
POSIX shll
sh
C shell
包括cshtcsh
C shell
csh
TEXES/TOPS C shell
tcsh
shell
腳本語言是若類型語言,較為通用的shell有標準的Bourne shellsh)和C shellcsh)。其中Bource shellsh)已經被bash shell取代。
查看系統的shell
[root@lamp ~]# cat /etc/shells
/bin/sh
/bin/bash #
功能更強大
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

常用操作系統的預設shell


Linux
bourne agaion shellbash)。
Solaris
FreeBSD預設的是Bourne shllsh)。
AIX
下是korn shellksh)。
HP-UX
預設的是POSIX shellsh)。
查看CentOS預設shell
第一種方法。
[root@lamp ~]# echo $SHELL
/bin/bash
[root@lamp ~]# echo $shell
bash
第二種方法。
[root@lamp ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
更改預設的shell配置文件。
[root@lamp ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

shell腳本的建立和執行


shell
腳本的建立。
linux系統中,shell腳本(bash shll程式)通常是在編輯器(如vi/vim)中編寫,由Unix/Linux命令、bash shell命令、程式結構控制語句和註釋等內容組成,推薦使用vim編輯器編寫,可以事先做一個別名alias vi='vim'
[root@lamp ~]# echo "alias vi='vim'" >>/etc/profile
[root@lamp ~]# tail -n 1 /etc/profile
alias vi='vim'
[root@lamp ~]# source /etc/profile
[root@lamp ~]# . /etc/profile
腳本開頭(第一行)
一個規範的shell腳本在腳本第一行會指出由哪個程式(解釋器)來執行腳本中的內容,這一行內容在linux bash編程中一般為:
#! /bin/bash

#! /bin/sh <==255
個字元以內
其中開頭的"#!"字元又稱為幻數,在執行bash腳本的時候,內核會根據"#!"後的解釋器來確定該用哪個程式解釋這個腳本的內容。註意,這一行必須在每個腳本頂端的第一行,如果不是第一行則為腳本註釋行,例如下麵的例子。
不加上訴第一行,預設就會使用linux預設的shell
[root@lamp ~]# cat test.sh 
#!/bin/bash
echo "shell start"
#!/bin/bash #
寫到這裡表示註釋
#!/bin/sh
echo "shell end"
sh
bash的區別,早期的bashsh稍有不同,它還包含了cshksh的特色,但大多數腳本都可以不加修改的在sh上運行。
[root@lamp ~]# ll /bin/sh
lrwxrwxrwx. 1 root root 4 Mar 10 2017 /bin/sh -> bash
[root@lamp ~]# ll /bin/bash 
-rwxr-xr-x. 1 root root 941944 Jan 12 2017 /bin/bash
sh
bash的軟連接,推薦用標準寫法#!/bin/bash
註意,當使用/bin/sh執行腳本不正常的時候,可以使用/bin/bash執行。
bash
的版本
[root@lamp ~]# bash -version
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
腳本註釋
shell腳本中,跟在(#)井號後面的內容表示註釋,用來對腳本進行註釋說明,註釋部分不會被當做程式執行,僅僅是給用戶看,系統解釋器是看不到的,更不會執行。註釋可自成一行,也可以跟在腳本命令後面與命令在同一行。開發腳本時,如果沒有註釋,團隊里的其他人就很難理解腳本究竟在做什麼,如果時間上了自己也會忘記。因此,我們要儘量養成為所開發的shell腳本書寫註釋的習慣。註釋書寫註意規範性,儘量不用中文。
shell
腳本的執行
shell腳本運行時,它會先查找系統環境變數ENV,該變數指定了環境文件(通常是.bashrc.bash_profile/etc/bashrc/etc/profile等),然後從該環境變數文件開始執行腳本,當讀取了ENV的文件後,shell會開始執行shell腳本中的內容。
特殊技巧:設置crond任務時,最好把系統環境變數在定時任務腳本中重新定義,否則,一些系統環境變數將不會被載入。
shell
腳本的執行通常可以採用以下幾種方式:
1
bash script-namesh script-name(推薦使用)。
2
path/script-name./script-name(當前路徑下執行腳本,需要腳本有執行許可權)。
3
source script-name. scripts-name"."點號)。
4
sh<script-namecat script-name|sh(同樣適合bash)。
執行說明
第一種方法是當腳本文件本身沒有可執行許可權(即文件x位為-號)時常使用的方法,或者文件開頭沒有指定解釋器。
第二種方法需要先將腳本文件的許可權改為可執行(即文件加X位),具體方法:chmod u+x script-namechmod 755 script-name。然後通過腳本路徑就可以直接執行腳本。
第三種放法通常是使用source"."點號讀入或載入指定的shell腳本文件(如test.sh),然後,依次執行指定shell腳本文件test.sh中的所有語句。
舉例說明:
[root@lamp ~]# cat >test.sh
echo 'i am shell'
輸入"echo 'i am shell'"內容後按回車,然後再按ctrl+d組合鍵即可結束編輯。
1
)通過第一種方法執行
[root@lamp ~]# cat test.sh 
echo 'i am shell'
[root@lamp ~]# sh test.sh 
i am shell
[root@lamp ~]# bash test.sh 
i am shell
2
)通過第二種方法執行
[root@lamp ~]# ll test.sh 
-rw-rw-r--. 1 root root 18 Jul 24 23:20 test.sh
[root@lamp ~]# ./test.sh #
使用第二種方式,"./"在當前目錄下執行test.sh腳本文件,無法使用tab自動補全
-bash: ./test.sh: Permission denied 
test.sh添加可執行許可權。
[root@lamp ~]# chmod u+x test.sh 
[root@lamp ~]# ./test.sh 
i am shell
3
)通過第三種方法執行
[root@lamp ~]# . test.sh 
i am shell
[root@lamp ~]# source test.sh 
i am shell
4
)通過第四種方法執行
[root@lamp ~]# sh <test.sh 
i am shell
[root@lamp ~]# cat test.sh|bash
i am shell
案例:已知如下命令及返回結果,請問echo $user的返回結果為()。
[root@lamp ~]# cat test.sh 
user=`whoami`
[root@lamp ~]# sh test.sh
[root@lamp ~]# echo $user
答案:空。
[root@lamp ~]# . test.sh 
[root@lamp ~]# echo $user
答案:root 
結論:1、子shell會直接繼承父shell的變數、函數等。2、如果希望父shell調用子shell的變數、函數等,用source"."點號執行腳本。
shell
腳本開發的基本習慣
1
)腳本第一行指定腳本解析器。
#!/bin/sh
#!/bin/bash
2
)腳本開頭加版本版權等信息
#Date
07:00 2018-07-26
#Mail
xxxxx@xxx
#Author
Created by golden
#Function
This scripts function is ...
#Version
1.3
提示:可以配置vim編輯文件時自動加上以上信息,方法是修改~/.vimrc配置文件。
3
)腳本中不用中文註釋
儘量用英文註釋,防止本機或切換系統環境後中文亂碼的困擾。
4
)腳本以.sh為擴展名命名。
5
)代碼書寫優秀習慣技巧
1
、成對的符號內容儘量一次寫出來,防止遺漏。
2
"[]"中括弧兩端要有空格,書寫時即可留出空格[ ],然後在退格書寫內容,先書寫一對中括弧,然後退一格,然後在輸入兩個空格,再退一格。 雙中括弧"[[]]"也是如此。
3
、流程式控制制語句一次書寫完,在添加內容。
if
語句格式一次完成。
if
條件內容
then
內容
fi
for
迴圈格式一次完成。
for
do
內容
done
6
)通過縮進讓代碼更易讀。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 因個人需求,需要將html格式轉換成PDF並加上水印圖片。於是乎第一次接觸這種需求的小菜鳥博主我,在某度搜索引擎上不斷的查閱關鍵字資料、踩坑,終於有了一個相應的解決方案。以下是解決步驟,記錄下來方便以後的回顧,以及各位大神們的品鑒。 1、在 NuGet 搜索 itextsharp 關鍵字 下載以下截 ...
  • 對.Net Core的學習和實踐,已經進行了一年多的世間,截止目前,微軟已經發佈.Net Core2.1,關於.NetCore的應用部署的文章比比皆是。今天藉此,回顧下.net core環境的部署過程。 首先,我這邊採用的是CentOS7+上的版本,.net core2.1。在動手前,我們先做這樣的 ...
  • 在很早之前就介紹過圖表插件Highcharts的使用了,在2014年的隨筆《基於MVC4+EasyUI的Web開發框架經驗總結(4)--使用圖表控制項Highcharts》,這裡基本上都介紹的比較完整,基本的設置也沒有太大的差異,本篇介紹的是基於Bootstrap開發框架的界面處理,以及對圖表插件Hi... ...
  • 0.簡介 Abp 框架在其內部實現了倉儲模式,並且支持 EF Core 與 Dapper 來進行資料庫連接與管理,你可以很方便地通過註入通用倉儲來操作你的數據,而不需要你自己來為每一個實體定義單獨的倉儲的實現,通用倉儲包含了常用的 CRUD 介面和一些常用方法。 例如: 1.通用倉儲定義與實現 在 ...
  • 在IIS上部署web api 完成後,瀏覽時出現了“The compiler failed with error code -2146232576.”的錯誤(有時會出現這個情況)。主要是 我們在.Net Framework 下創建Web API的時候,選擇預設的模板後,VS在創建項目時會添加一些組件 ...
  • 實際開發中有很多項目需要引用第三方的dll或者資源文件,且文件比較多,在運行時這些文件需要被拷貝到BIN目錄。 使用VS自帶的"複製到輸出目錄",似然方便,但是比較不零活,經過多次摸索,終於有了一個很好的解決辦法。 將csproj中copy指令的用法如下: 1、記事本打開啟動項目的 csproj文件 ...
  • 線程概述 線程是一個獨立處理的執行路徑。每個線程都運行在一個操作系統進程中,這個進程是程式執行的獨立環境。在單線程中進程的獨立環境內只有一個線程運行,所以該線程具有獨立使用進程資源的權利。在多線程程式中,在進程中有多個線程運行,所以它們共用同一個執行環境。 基礎線程(thread) 使用Thread ...
  • 基於 Red Hat Enterprise Linux 7.5 或者 CentOS 7.4 基本概念 Linux最核心的一個概念就是:Linux裡面任何東西都可以被視為一個文件,包括系統本身(說到底Linux啟動不就是調用那些開機文件再連帶啟動其他的文件麽~~~) User:文件擁有者 Group: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...