shell入门之一
第1章 shell入門
? shell是一個(gè)命令解釋器,它的操作系統(tǒng)的最外層,負(fù)責(zé)直接與用戶對(duì)話,把用戶的輸入解釋給操作系統(tǒng),并處理各種二樣的操作系統(tǒng)的輸出結(jié)果,輸出屏幕返回給用戶
? 對(duì)話的方式可以是:
? 交互式方式:從鍵盤輸入命令,通過/bin/bash 解析,可以立即得到shell的回應(yīng)
? 非交互式方式:腳本
?
1.1 下圖就是命令解釋器:
?
?
?
????????? shell是英文是貝殼的意思,命令解釋器shell像一個(gè)貝殼一樣包住系統(tǒng)核心
????????? shell執(zhí)行的命令分為兩種方式:
?
? 內(nèi)置命令:如講過的cd . pwd exit 和echo 等命令,當(dāng)用戶登錄系統(tǒng)后,shell以及內(nèi)置命令就被系統(tǒng)載入到內(nèi)存,并且一直運(yùn)行著。
? 一般命令:如ls,磁盤上的程序文件à調(diào)入內(nèi)存à執(zhí)行命令
?
第2章 什么是shell腳本
? 當(dāng)linux命令或語句不在命令行下執(zhí)行(嚴(yán)格說,命令行也是shell),而是通過一個(gè)程序文件執(zhí)行時(shí),改程序就被稱為Shell腳本或shell程序
?
? 用戶可以在shell腳本中敲入一系列的命令及命令語句組合。這些命令,變量和流程控制語句等有機(jī)的結(jié)合起來久形成一個(gè)功能強(qiáng)大的shell腳本
?
2.1 首先先帶領(lǐng)大家寫一個(gè)清空/var/log/messages日志的腳本
我們需要先想明白幾個(gè)問題:
1)?? 日志文件在哪?
/var/log/messages
2)?? 用什么命令可以清空文件?
> 重定向
3)?? 寫一個(gè)簡單的shell腳本。
#!/bin/bash
cd /var/log/
>messages4)??? 怎樣執(zhí)行腳本?
[root@kaile ~]# sh /server/scripts/clear.sh
5)?? 有沒有考慮到:
·????????有沒有腳本放在統(tǒng)一的目錄
/server/scripts目錄下
·????????權(quán)限:用哪個(gè)用戶執(zhí)行文件
需要對(duì)用戶做判斷
·?????清空錯(cuò)文件怎么辦,該如何辦?
·?????錯(cuò)誤提示:有沒有成功知不知道?
·?????腳本的通用性
2.2范例:包含命令,變量和流程控制的清空/var/log/messages日志的shell腳本
[root@kaile ~]# mkdir -p /server/scripts #要有規(guī)范的存放腳本目錄
[root@kaile ~]# vim /server/scripts/clear.sh
[root@kaile ~]# cd /server/scripts/
[root@kailescripts]# cat /server/scripts/clear.sh
#!/bin/bash??????????????????????????? #指定解釋器
?
LOG_DIR=/var/log???????????????????????? #設(shè)置變量
?
?
if [ "$UID" == "0" ];then?????? UID等于然后執(zhí)行下面的命令
?cd $LOG_DIR
?>message
?echo "Logclear yes"
fi
~????
清空日志的三種方法:
echo >test.log
>test.log
cat /dev/null>test.log
#清空內(nèi)容,保留文件
2.3小結(jié):
·????????Shell就是命令解釋器。==>翻譯官
·????????Shell腳本==>命令放在腳本里
2.4Shell腳本在運(yùn)維工作中的作用地位
? Shell腳本擅長處理純文本類型的數(shù)據(jù),而Linux中幾乎所有的配置文件,日志文件等都是純文本類型文件。
2.5Shell腳本的建立和執(zhí)行
2.61Shell腳本的建立
推薦使用vim編輯器編輯腳本,可以事先做個(gè)別名。
[root@kailescripts]# echo "aliasvi=vim">>/etc/profile
[root@kailescripts]# source /etc/profile
2.7腳本開頭第一行
? 規(guī)范的Shell腳本第一行會(huì)指出由哪個(gè)程序(解釋器)來執(zhí)行腳本中的內(nèi)容。在linux bash編程中一般為:
#!/bin/bash
或
#!/bin/sh
? 其中開頭的“#!”又稱為幻數(shù),在執(zhí)行Shell腳本的時(shí)候,內(nèi)核會(huì)根據(jù)“#!”后的解釋器來確定哪個(gè)程序解釋腳本中的內(nèi)容。注意:這一行必須在每個(gè)腳本頂端的第一行,如果不是第一行則為腳本注釋行。
2.8sh和bash的區(qū)別
[root@kaile scripts]# ll /bin/sh
lrwxrwxrwx. 1 rootroot 4 Dec 2320:25 /bin/sh -> bash
? #sh是bash的軟鏈接,推薦標(biāo)準(zhǔn)寫法#!/bin/bash
可以看一下系統(tǒng)自帶的腳本的寫法
head -1 /etc/init.d/*
2.93 bash版本
[root@kailescripts]# bash --version
GNU bash,version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 FreeSoftware Foundation, Inc.
License GPLv3+:GNU GPL version3or later <http://gnu.org/licenses/gpl.html>
?
This is freesoftware; you are free to changeand redistribute it.
There isNOWARRANTY, to the extent permitted by law.
2.103.1.4 bash漏洞【破殼漏洞】
如果是比較老的系統(tǒng),需要注意shell的版本太低,有漏洞,需要升級(jí)shell
[root@kailescripts]# yum -y update bash
#驗(yàn)證方法
[root@kailescripts]# env x='(){ :;};echo be careful' bash -c"echo this is a test"
thisis a test
如果返回2行
??? be careful
??? thisis a test
這樣的結(jié)果的話,請(qǐng)盡快升級(jí)2.11不同語言腳本的開頭寫法
#!/bin/sh
#!/bin/bash
#!/usr/bin/awk
#!/bin/sed
#!/usr/bin/tcl
#!/usr/bin/expect
#!/usr/bin/perl
#!/usr/bin/env python
? 如果腳本開頭不指定解釋器,就要用對(duì)應(yīng)的解釋器執(zhí)行腳本。例如bashtest.sh和python.test.py
? 要求:養(yǎng)成一個(gè)好習(xí)慣,開頭加上相應(yīng)的解釋器標(biāo)識(shí)。
2.12腳本注釋
? 在Shell腳本中,跟在#后面的內(nèi)容表示注釋。注釋部分不會(huì)被執(zhí)行,僅給人看。注釋可以自成一行,也可以跟在命令后面,與命令同行。要養(yǎng)成寫注釋的習(xí)慣,方便自己與他人。
? 最好不用中文注釋,因?yàn)樵诓煌址南到y(tǒng)會(huì)出現(xiàn)亂碼。
2.13Shell腳本的執(zhí)行
2.14Shell腳本執(zhí)行的四種方式
? 1)bash scripts-name或sh script-name(推薦使用)
這種方法是當(dāng)腳本本身沒有可執(zhí)行權(quán)限時(shí)常使用的方法。
? 2)path/script-name 或./scripts-name(全路徑或當(dāng)前路徑執(zhí)行腳本)
這種方法首先需要給腳本文件可執(zhí)行權(quán)限。
? 3)sourcescripts-name或.scripts-name #注意“.”點(diǎn)號(hào),且點(diǎn)號(hào)后有空格。
source 或.在執(zhí)行這個(gè)腳本的同時(shí),可以將腳本中的函數(shù)和變量加載到當(dāng)前Shell。不會(huì)產(chǎn)生子shell。又有點(diǎn)像nginx的include功能。
2.15Shell腳本開發(fā)的規(guī)范和習(xí)慣
1)開頭指定腳本解釋器
2)開頭加版本版權(quán)等信息,可配置~/.vimrc文件自動(dòng)添加
3)腳本不要用中文注釋,盡量用英文注釋
4)腳本以.sh為擴(kuò)展名
5)放在統(tǒng)一的目錄
6)代碼書寫優(yōu)秀習(xí)慣
a,成對(duì)的內(nèi)容一次性寫出來,防止遺漏,如[],'',""等
b,[]兩端要有空格,先輸入[]退格,輸入2個(gè)空格,再退格寫。
c,
流程控制語句一次書寫完,再添加內(nèi)容。
if條件
??? then
????? 內(nèi)容
fi
d,通過縮進(jìn)讓代碼易讀
f,腳本中的引號(hào)都是英文狀態(tài)下的引號(hào),其他字符也是英文狀態(tài)。
好的習(xí)慣可以讓我們避免很多不必要的麻煩,提高工作效率。
第3章 Shell環(huán)境變量
3.1什么是變量
? 變量就是用一個(gè)固定的字符串(也可能是字符數(shù)字等的組合),替代更多更復(fù)雜的內(nèi)容,這個(gè)內(nèi)容里可能還會(huì)包含變量和路徑,字符串等其他內(nèi)容。變量的定義是存在內(nèi)存中。
x=1
y=2
x變量?? 一個(gè)=賦值?? ==相等
?
定義變量三種方法?
自定義變量?
read? 變量?
參數(shù)變量??
3.2變量類型
? 變量分為兩類:
1)環(huán)境變量(也可稱為全局變量);可以在創(chuàng)建他們的Shell及派生出來的子shell中使用。環(huán)境變量又可以分為自定義環(huán)境變量和bash內(nèi)置的環(huán)境變量。
? 2)局部變量(普通變量):只能在創(chuàng)建他們的shell函數(shù)或shell腳本中使用,還記得前面的$user我們創(chuàng)建的一般都是普通變量。
3.3環(huán)境變量
·????????環(huán)境變量用于定義Shell的運(yùn)行環(huán)境,保證Shell命令的正確執(zhí)行,Shell通過環(huán)境變量來確定登錄用戶名,命令路徑,終端類型,登錄目錄等,所有的環(huán)境變量都是全局變量,可用于所有子進(jìn)程中,包括編輯器,shell腳本和各類應(yīng)用。但crond計(jì)劃任務(wù)除外,還需要重新定義環(huán)境變量。
·????????環(huán)境變量可以在命令行中設(shè)置,但用戶退出時(shí)這些變量值也會(huì)丟失,因此最好在用戶家目錄下的.bash_profile文件中或全局配置/etc/bashrc,/etc/profile文件或者/etc/profile.d/目錄中定義。將環(huán)境變量放入profile文件中,每次用戶登錄時(shí)這些變量值都將被初始化。
·????????通常,所有環(huán)境變量均為大寫。環(huán)境變量應(yīng)用于用戶進(jìn)程前,都應(yīng)該用export命令導(dǎo)出。例如:exportclear=1
·????????有一些環(huán)境變量,比如HOME,PATH,SHELL,UID,USER等,在用戶登錄之前就已經(jīng)被/bin/login程序設(shè)置好了。通常環(huán)境變量定義并保存在用戶家目錄下的.bash_profile或/etc/profile文件中。
3.3.1 #顯示環(huán)境變量
[root@kailescripts]# echo $HOME
/root
[root@kailescripts]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@kailescripts]# echo $SHELL
/bin/bash
[root@kailescripts]# echo $UID
0
[root@kailescripts]# echo $USER
root
?
3.3.2查看系統(tǒng)環(huán)境變量
[root@kailescripts]# env #查看系統(tǒng)環(huán)境變量
HOSTNAME=kaile
SELINUX_ROLE_REQUESTED=
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=500
SSH_CLIENT=192.168.197.149592 22
SELINUX_USE_CURRENT_RANGE=
OLDPWD=/root
SSH_TTY=/dev/pts/1
LC_ALL=C
USER=root
#中間省略部分內(nèi)容....
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/server/scripts
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=192.168.197.149592 192.168.197.133 22
LESSOPEN=||/usr/bin/lesspipe.sh%s
G_BROKEN_FILENAMES=1
_=/bin/env
3.3.3 #當(dāng)前終端變量
[root@kailescripts]# echo $PS1
[\u@\h \W]\$
3.4局部變量
定義局部變量
局部變量在用戶當(dāng)前的shell生存期的腳本中使用。例如,局部變量clear取值為clear098,這個(gè)值只在用戶當(dāng)前shell生存期中有意義。如果在shell中啟動(dòng)另一個(gè)進(jìn)程或退出,局部變量clear值將無效。
普通字符串變量定義
變量名=value
變量名=‘value’
變量名=“value”
shell中變量名及變量內(nèi)容的要求
·?????一般是字母,數(shù)字,下劃線組成,且以字母開頭。如clear,kaile23,clear-training。變量的內(nèi)容,可以使用單引號(hào)或雙引號(hào)印起來,或不加引號(hào)。
·?????雖然變量可以以下劃線開頭,但類似這種變量都是比較特殊的,都是系統(tǒng)自己用的。我們盡量少用。
[root@kaile?scripts]#?_123=eeee[root@kaile?scripts]#?echo?$_123eeee普通字符串變量定義測試
[root@kaile?scripts]#?a=192.168.1.2[root@kaile?scripts]#?b='192.168.1.2'[root@kaile?scripts]#?c="192.168.1.2"[root@kaile?scripts]#?echo?"a=$a"a=192.168.1.2[root@kaile?scripts]#?echo?"b=$b"b=192.168.1.2[root@kaile?scripts]#?echo?"c=${c}"c=192.168.1.2[root@kaile?scripts]#?a=192.168.1.2-$a[root@kaile?scripts]#?b='192.168.1.2-$a'[root@kaile?scripts]#?c="192.168.1.2-$a"[root@kaile?scripts]#?echo?"a=$a"a=192.168.1.2-192.168.1.2[root@kaile?scripts]#?echo?"b=$b"b=192.168.1.2-$a[root@kaile?scripts]#?echo?"c=${c}"c=192.168.1.2-192.168.1.2-192.168.1.2把一個(gè)命令做為變量
[root@kailescripts]# ls
clear.sh? clear_log.sh
[root@kaile scripts]# CMD=`ls`
[root@kailescripts]# echo $CMD
clear.shclear_log.sh
[root@kailescripts]# CMD1=$(pwd)
[root@kailescripts]# echo $CMD1
/server/scripts
變量名=`ls`?<==反引號(hào)變量名=$(ls)小結(jié):
1)CMD=ls的ls兩側(cè)的符號(hào)是鍵盤tab鍵上面的,不是單引號(hào)。
2)在變量名前加$,可以取得此變量的值,使用echo或printf命令可以顯示變量的值,$A和$(A)寫法不同,效果一樣,推薦后面的寫法。
3)${WEEK}DAY若變量和其他字符組成新的變量就必須給變量加上大括號(hào){}.
4)養(yǎng)成將所有字符串變量用雙引號(hào)括起來使用的習(xí)慣,減少編程遇到的怪異錯(cuò)誤。“$A”和“${A}”
3.5變量名及變量內(nèi)容定義小結(jié)
1.?????????變量名只能由字母,數(shù)字,下劃線組成,且以字母開頭。
2.?????????規(guī)范的變量名寫法定義:見名知意
a,ClearAge=1 <==每個(gè)單詞首字母大寫
b,clear_age=1 <==每個(gè)單詞之間用“-”
c,clearAgeSex=1<==駝峰語法:首個(gè)單詞字母小寫,其余單詞首字母大寫
3.? =號(hào)的知識(shí),a=1中的等號(hào)是賦值的意思,比較是不是相等為“==”
4.?????????打印變量,變量名前接$符號(hào),變量名后接字符的時(shí)候,要用大括號(hào)括起來
[root@kaile ~]# word="big"
[root@kaile ~]# echo ${word}ger
bigger
[root@kaile ~]# echo $wordger
?1.? 注意變量內(nèi)容引用方法,一般為雙引號(hào),簡單連續(xù)字符可以不加引號(hào),希望原樣輸出,使用單引號(hào)。
2.? 變量內(nèi)容是命令,要用反引號(hào)``或者$()把變量括起來使用
Shell腳本可以提高我們?nèi)粘9ぷ鞯男?。?
學(xué)好一門編程語言 ?多練 多敲 多思考 再練 在思考 。。。。。
轉(zhuǎn)載于:https://blog.51cto.com/kaile/1918675
總結(jié)
- 上一篇: @ConfigurationProper
- 下一篇: Docker - 手动迁移镜像