跟高手學習LINUX筆記-19

第19節 shell基礎
本節所講內容:
19.1 shell 基本語法
終於在前面的章節把centos7基礎介紹完成了,餘下的幾個章節都圍繞這幾個方面去介紹。
關於shell及腳本,通過工作中的實際應用總結以下幾點,請大家斧正:
1、腳本很重要,特別是在linux自動化運維方面
2、腳本要多多練習,最少能讀懂。建議是把別人腳本修改成自己的。
3、正則表達式一定要靜下心來好好學學
4、三劍客“grep awk sed”一定要熟練掌握
19.1.1 什麼是shell
shell:跟它的英文單詞的意思一樣,是命令解釋器,工作在用戶與內核之間的命令解釋翻譯功能
計算機懂什麼語言?二進制語言
人類懂什麼語言?符號語言
在計算機與人類之間的溝通就需要一個翻譯了,這個就是shell橫空出現的原因了
通過前面的章節大家知道系統的靈魂是內核,如果每個用戶都能去直接操作內核的話,我相信任何一個系統都如玻璃般脆
應用程序-->shell-->內核-->硬件
人類的命令-->鍵盤輸入-->shell-->二進制命令-->內核 輸入執行命令的過程
顯示命令結果<--顯示器顯示<--shell<--二進制結果<--內核 輸出命令結果的過程
19.1.2 有哪些shell
[root@node-1 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
常用的是/bin/bash
所在腳本第一行就是:#!/bin/bash 這句話的意思是調用這個shell作爲命令解釋器
19.2 SHELL變量及運用
19.2.1編寫腳本的流程:
1)創建目錄,集中存放腳本文件;
2)編寫腳本內容;
vi 腳本名.sh ##編輯腳本文件
#!/bin/bash ##聲明解釋器
#註釋內容 ##可以註釋些信息,方便後續查看
命令及控制語句 ##腳本的核心內容
:wq ##保存文件
3)賦予腳本文件執行權限:chmod +x 腳本名.sh
4)運行腳本 腳本名.sh;
注意事項:
腳本中的路徑建議用絕對路徑
例1:牛刀小試一把
[root@node-1 ~]# mkdir /root/bash
[root@node-1 ~]# vim /root/bash/test1.sh
[root@node-1 ~]# cat /root/bash/test1.sh
#this is a test
#!/bin/bash
echo "Nice to meet you!"
mkdir /tmp/aa
touch /tmp/aa/aa.txt
[root@node-1 ~]# chmod +x /root/bash/test1.sh
[root@node-1 ~]# /root/bash/test1.sh
Nice to meet you!

[root@node-1 ~]# ll /tmp/aa /tmp
/tmp:
total 0
drwxr-xr-x 2 root root 19 Mar 10 10:41 aa

/tmp/aa:
total 0
-rw-r--r-- 1 root root 0 Mar 10 10:41 aa.txt
19.2.2 echo命令:返回結果並顯示--輸入即輸出;
語法:echo [選項] "需要返回的值"
選項: 選項-e 若出現特殊字符則不將其轉義,當普通字符對待;
在返回值中\n 代表強制換行、\t代表製表符;
內容中的選項:"內容\t內容" 插入tab
"內容\n內容" 強制換行
[root@node-1 ~]# echo -e "my name is \t tom"
my name is tom
[root@node-1 ~]# echo -e "my name is \n tom"
my name is
tom
19.2.3 腳本中的變量的應用;
1.概述:變量是一個筐,筐裏裝的是變量的值,只需要將筐帶走,那麼值也就隨之帶走,值爲可變;
[root@node-1 ~]# NAME="tom"
[root@node-1 ~]# echo $NAME
tom
[root@node-1 ~]# NAME="TOM"
[root@node-1 ~]# echo $NAME
TOM
2.優點:簡化輸入,使腳本內容更加清晰,提高腳本的適用性;
3.分類:自定義變量、環境變量、位置變量、預定義變量;
4.自定義變量的定義:
a.定義變量:變量名=變量值
b.查看變量:echo $變量名
c.使用變量:在命令中直接使用 $變量名
d.取消變量:unset 變量名
e.變量的作用範圍:
局部變量:變量名=變量值,此種變量只能在當前bash中有效;
全局變量:export 變量名=變量值,此種變量在當前bash和當前子bash中有效;
注:可用 bash命令開啓當前進程的子進程bash,exit退回到父bash進程;
f.變量值中使用的括號:
"" :弱引用,會將雙引號內的特殊符號與命令一起執行
[root@node-1 ~]# A="give me $5" --無轉義字符
[root@node-1 ~]# echo $A
give me
[root@node-1 ~]# A="give me \$5" --雙引號
[root@node-1 ~]# echo $A
give me $5
'' :強引用,會將單引號內的$、"、\等特殊符號失效,全部當成普通字符;
[root@node-1 ~]# A='give me \$5' --單引號
[root@node-1 ~]# echo $A
give me \$5
` :在定義變量時,引用命令,在值中引用變量等同於$(),''不可嵌套,$()可以嵌套;<br/>[root@node-1 ~]# DuEtc=du -sh /etc/` && echo $DuEtc
35M /etc/
$():在定義變量時,引用命令,可以嵌套;例:AC=$(rpm -qf $(which rz))
[root@node-1 ~]# QfNtp=$(rpm -qf $(which ntpdate))
[root@node-1 ~]# echo $QfNtp
ntpdate-4.2.6p5-28.el7.centos.x86_64
注:當變量值中包含'單引號時,應使用\'將單引號進行轉義;
g.變量名不能使用特殊符號,一般用大寫字母和下劃線;
19.2.3 預定義變量:用戶只能使用,不能創建,不能直接賦值;
$0:爲腳本本身的名稱
$:爲腳本後的所有參數
$#:腳本參數個數
$?:上一條命令是否執行成功,返回值爲0則成功,非0爲失敗
[root@node-1 ~]# vim /root/bash/print.sh
[root@node-1 ~]# chmod +x /root/bash/print.sh
[root@node-1 ~]# /root/bash/print.sh aa bb
本shell腳本的文件名: /root/bash/print.sh
參數個數: 2
參數有哪些: aa bb
是否執行成功: 0
第1個參數: aa
第2個參數: bb
[root@node-1 ~]# cat /root/bash/print.sh
#!/bin/bash
echo "本shell腳本的文件名: $0"
echo "參數個數: $#"
echo "參數有哪些: $
"
echo "是否執行成功: $?"
echo "第1個參數: $1"
echo "第2個參數: $2"
19.2.4 環境變量的定義:
1)環境變量設置用戶工作環境,名稱不能修改,值可以修改;
2)環境變量的常用:
PATH=設置外部命令的存放的路徑,用冒號隔開
TMOUT=設置登錄超時,單位爲秒
HISTSIZE=設置歷史命令記錄的條數
LANG=設置語言環境(vi /etc/sysconfig/i18n 進行永久修改字符集)
注:設置臨時環境變量時(註銷就失效了):export PATH=
3)環境變量的查看:
env命令查看當前工作環境的所有環境變量
/etc/profile 、/etc/bashrc文件爲用戶每次登陸執行的的配置文件;
/root/.bash_profile、/root/.bashrc 每個root獨立的環境變量配置文件;其他用戶也是存在的,在安裝oracle時需要對oracle用戶相關環境變量進行修改
19.3 實戰-安裝可升級的java環境-爲後期安裝Hadoop集羣做準備
1) 上傳不同版本的jdk軟件包到/usr/local/src目錄下
[root@node-1 src]# ll
total 326364
-rw-r--r-- 1 root root 142376665 Aug 11 2014 jdk-7u67-linux-x64.tar.gz
-rw-r--r-- 1 root root 191817140 May 3 2019 jdk-8u201-linux-x64.tar.gz
2)安裝命令
[root@node-1 src]# tar -zxf jdk-7u67-linux-x64.tar.gz
[root@node-1 src]# mv jdk
jdk1.7.0_67/ jdk-7u67-linux-x64.tar.gz jdk-8u201-linux-x64.tar.gz
[root@node-1 src]# mv jdk1.7.0_67/ /usr/local/
[root@node-1 local]# ln -s jdk1.7.0_67/ jdk
[root@node-1 local]# ll
total 4
drwxr-xr-x. 2 root root 6 Apr 11 2018 bin
drwxr-xr-x. 2 root root 6 Apr 11 2018 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 games
drwxr-xr-x. 2 root root 6 Apr 11 2018 include
lrwxrwxrwx 1 root root 12 Mar 10 11:25 jdk -> jdk1.7.0_67/
drwxr-xr-x 8 10 143 4096 Jul 26 2014 jdk1.7.0_67
.......
3)配置Java環境變量/etc/profile在最後一行添加以下三行
export JAVA_HOME=/usr/local/jdk/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
[root@node-1 local]# source /etc/profile
4)驗證環境變量
[root@node-1 local]# java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
5)升級java環境
[root@node-1 local]# cd /usr/local/src
[root@node-1 src]# tar -zxf jdk-8u201-linux-x64.tar.gz
[root@node-1 src]# mv jdk1.8.0_201/ /usr/local/
[root@node-1 src]# cd /usr/local/
[root@node-1 local]# ln -snf jdk1.8.0_201 jdk
[root@node-1 local]# ll
total 8
drwxr-xr-x. 2 root root 6 Apr 11 2018 bin
drwxr-xr-x. 2 root root 6 Apr 11 2018 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 games
drwxr-xr-x. 2 root root 6 Apr 11 2018 include
lrwxrwxrwx 1 root root 12 Mar 10 11:32 jdk -> jdk1.8.0_201
drwxr-xr-x 8 10 143 4096 Jul 26 2014 jdk1.7.0_67
drwxr-xr-x 7 10 143 4096 Dec 16 2018 jdk1.8.0_201
.......
[root@node-1 local]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
無縫升級成功,其他軟件版本也可以這樣來處理如:nginx等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章