自建個人網(wǎng)站seo關(guān)鍵詞查詢
目錄
1.Shell腳本基礎(chǔ)
1.1Shell概述
1.2Shell腳本應(yīng)用場景
1.3Linux中常見的Shell
1.4Shell的作用
2.腳本的構(gòu)成
2.1編寫腳本
2.2執(zhí)行腳本
2.2.1使用路徑執(zhí)行(需要加執(zhí)行權(quán)限)
2.2.2直接使用解釋器(不需要加執(zhí)行權(quán)限)
2.2.3source和" . "執(zhí)行(不需要加執(zhí)行權(quán)限)——不推薦(會影響環(huán)境變量)
2.2.4腳本錯誤調(diào)試
2.2.5延伸
3.重定向和管道符
3.1重定向
3.1.1延伸
3.2多行重定向
3.3管道符
4.特殊符號
5.變量
5.1變量的作用
5.2命名要求
5.3定義變量
5.4只讀變量
5.5自定義變量(約等于別名)
5.6變量追加值(+=)
5.7交互的定義變量
5.8變量作用范圍
6.整數(shù)運算
6.1expr——只能進行整數(shù)運算(乘*需要加轉(zhuǎn)義\)
6.2bc計算器——交互式的進行算數(shù)(支持非整數(shù))
6.3let——只支持整數(shù)運算
6.4((num=x+x))——支持整數(shù)運算
6.5sum=$[x*x]——支持整數(shù)運算
6.6延伸——變量的運算
7.RANDOM——隨機數(shù)生成器
7.1延伸
8.修改顏色
8.1顏色修改
8.2隨機顏色
8.3延伸——打印當前系統(tǒng)信息
9.環(huán)境變量
?10.位置變量
11.預(yù)定義變量
12.延伸——()和{}
前言
程序編程風格
面向過程語言? ?開發(fā)的時候 需要 一步一步 執(zhí)行
- 做一件事情,排出個步驟,第一步干什么,第二步干什么,如果出現(xiàn)情況A,做什么處理,如果出現(xiàn)了情況B,做什么處理
- 問題規(guī)模小,可以步驟化,按部就班處理
- 以指令為中心,數(shù)據(jù)服務(wù)于指令
- C,shell
面向?qū)ο笳Z言? ?開發(fā)的 時候 將 任務(wù) 當成一個整體
- 將編程看成是一個事物,對外界來說,事物是直接使用的,不用關(guān)心事物內(nèi)部的情況。而編程就是設(shè)置事物能夠完成功能。
- 一種認識世界、分析世界的方法論。將萬事萬物抽象為各種對象
- 類是抽象的概念,是萬事萬物的抽象,是一類事物的共同特征的集合
- 對象是類的具象,是一個實體
- 問題規(guī)模大,復(fù)雜系統(tǒng)
- 以數(shù)據(jù)為中心,指令服務(wù)于數(shù)據(jù)
- java,python,golang等 云 go k8個字母s 平臺
WIndows基本也都是面向?qū)ο蟮某绦? 只能看到結(jié)果
三種處理邏輯
順序執(zhí)行:程序按從上到下順序執(zhí)行
選擇執(zhí)行:程序執(zhí)行過程中,根據(jù)條件的不同,進行選擇不同分支繼續(xù)執(zhí)行
循環(huán)執(zhí)行:程序執(zhí)行過程中需要重復(fù)執(zhí)行多次某段語句(已知次數(shù) 已知條件 死循環(huán))
1.Shell腳本基礎(chǔ)
1.1Shell概述
- 將要執(zhí)行的命令按順序保存到一個文本文件
- 給該文件可執(zhí)行權(quán)限
- 可結(jié)合各種Shell控制語句以完成更復(fù)雜的操作
腳本是命令的集合;
將命令一一列出,最后自動執(zhí)行;
執(zhí)行需要權(quán)限,也可以直接使用路徑;
Linux 系統(tǒng)中的 Shell 是一個特殊的應(yīng)用程序,它介于操作系統(tǒng)內(nèi)核與用戶之間,充當 了一個“命令解釋器”的角色,負責接收用戶輸入的操作指令(命令)并進行解釋,將需要執(zhí) 行的操作傳遞給內(nèi)核執(zhí)行,并輸出執(zhí)行結(jié)果。 常見的 Shell 解釋器程序有很多種,使用不同的 Shell 時,其內(nèi)部指令、命令行提示符 等方面會存在一些區(qū)別。通過/etc/shells 文件可以了解當前系統(tǒng)所支持的 Shell 腳本種類。
[root@localhost ~]#cat /etc/shells
#查看當前系統(tǒng)支持的Shell
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
1.2Shell腳本應(yīng)用場景
- 重復(fù)性操作
- 交互性任務(wù)
- 批量事務(wù)處理
- 服務(wù)運行狀態(tài)監(jiān)控
- 定時任務(wù)執(zhí)行
重復(fù)性操作、定時任務(wù)執(zhí)行:腳本可以放到Crontab? -e定時計劃任務(wù)中執(zhí)行;
交互性任務(wù):腳本的目的是避免人機交互
批量事務(wù)處理:將要執(zhí)行的命令按順序保存到一個文本文件進行批量操作
服務(wù)運行狀態(tài)監(jiān)控:例如過濾80端口的httpd服務(wù)
1.3Linux中常見的Shell
- bash:基于gun的框架下發(fā)展的shell
- csh:類似c語言的shell
- tcsh:整合了csh提供了更多功能
- sh:已經(jīng)被bash替換
- nologin:讓用戶無法登錄
bash (/bin/bash)是目前大多數(shù)Linux 版本采用的默認shell
1.4Shell的作用
- Shell的作用——命令解釋器,“翻譯官”
- 介于系統(tǒng)內(nèi)核與用戶之間,負責解釋命令行
用戶登錄的Shell
- 登錄后默認使用的Shell程序,一般為/bin/bash
- 不同Shell的內(nèi)部指令、運行環(huán)境等會有所區(qū)別
2.腳本的構(gòu)成
編寫腳本代碼
- 使用vim文本編輯器
- 每行一條Linux命令,按執(zhí)行順序依次編寫
[root@localhost ~]#vim test.sh#!/bin/bash
cd /opt
pwd
touch cxk[root@localhost ~]#bash test.sh
/opt
[root@localhost ~]#ls /opt
cxk rh
賦予可執(zhí)行權(quán)限
- 使腳本具有可執(zhí)行權(quán)限
[root@localhost ~]#chmod +x test.sh
[root@localhost ~]#ll test.sh
-rwxr-xr-x 1 root root 34 1月 22 14:36 test.sh
總結(jié)
- 腳本申明(解釋器):第一行開頭“#! /bin/bash”表示此行以下的代碼語句是通過/bin/bash程序來解釋執(zhí)行。#! /bin/bash為默認的解釋器還有其他類型的解釋器(例如還有#! /bin/python? ? ?#! /bin/expece? 代碼語句)
- 注釋信息:以#開頭的語句表示為注釋信息? ? #代表注釋
- 可執(zhí)行語句:比如echo、ls、touch等命令用于輸出“? ” 之間的字符串
2.1編寫腳本
[root@localhost ~]#vim test.sh#!/bin/bash#這是我的第一個腳本echo "hello world"[root@localhost ~]#bash test.sh
hello world
2.2執(zhí)行腳本
2.2.1使用路徑執(zhí)行(需要加執(zhí)行權(quán)限)
[root@localhost /]#/test.sh
#絕對路徑
hello world
[root@localhost /]#./test.sh
#相對路徑
hello world
2.2.2直接使用解釋器(不需要加執(zhí)行權(quán)限)
[root@localhost ~]#bash test.sh
hello world
2.2.3source和" . "執(zhí)行(不需要加執(zhí)行權(quán)限)——不推薦(會影響環(huán)境變量)
[root@localhost ~]#. test.sh
hello world
[root@localhost ~]#source test.sh
hello world
[root@localhost ~]#ll test.sh
-rwxr-xr-x 1 root root 62 1月 22 14:51 test.sh
如果使用bash或者路徑執(zhí)行腳本,會開啟子bash環(huán)境去執(zhí)行腳本;使用source和 . 執(zhí)行腳本 會影響當前的bash環(huán)境;
腳本執(zhí)行結(jié)束后會結(jié)束;
如果想補全腳本的話? 可以通過軟連接的方式,ln -s
2.2.4腳本錯誤調(diào)試
腳本執(zhí)行邏輯
- 順序執(zhí)行:程序按從上到下順序執(zhí)行
- 選擇執(zhí)行:程序執(zhí)行過程中,根據(jù)條件的不同,進行選擇不同分支繼續(xù)執(zhí)行
- 循環(huán)執(zhí)行:程序執(zhí)行過程中需要重復(fù)執(zhí)行多次某段語句
1.命令錯誤
命令執(zhí)行如果錯誤的話,不會影響接下來的命令執(zhí)行
[root@localhost ~]#vim test.sh#/bin/bashech "hello world"cd /opt
touch cxk[root@localhost ~]#bash test.sh
test.sh:行3: ech: 未找到命令
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
cxk
2.語法錯誤
會影響接下來的命令繼續(xù)
[root@localhost ~]#vim test.sh
#/bin/bashech "hello world"c /opt
touch cxk[root@localhost ~]#bash test.sh
test.sh:行3: ech: 未找到命令
test.sh:行6: c: 未找到命令
[root@localhost ~]#ls /opt
3.邏輯錯誤
如果邏輯錯誤的話只能自己去篩查哪里出錯
[root@localhost ~]#bash -x test.sh
+ ech 'hello world'
test.sh:行3: ech: 未找到命令
+ c /opt
test.sh:行6: c: 未找到命令
+ touch cxk
bash -n 腳本名稱 (不在當前目錄下加絕對路徑) ? ? 檢查語法錯誤
bash -x 腳本名稱 (不在當前目錄下加絕對路徑) ? ? 邏輯錯誤
總結(jié)
1.語法錯誤:會導(dǎo)致后續(xù)的命令不繼續(xù)執(zhí)行,可以用bash -n 檢查錯誤,提示的出錯行數(shù)不一定是準確的
2.命令錯誤:默認后續(xù)的命令還會繼續(xù)執(zhí)行,用bash -n 無法檢查出來 ,可以使用 bash -x 進行觀察
3.邏輯錯誤:只能使用 bash -x 進行
2.2.5延伸
set -e
如果命令出錯,立即停止
[root@localhost ~]#vim test.sh#/bin/bashset -e
cd /op
rm -rf ./*[root@localhost ~]#bash test.sh
test.sh: 第 4 行:cd: /op: 沒有那個文件或目錄
set -u
變量出錯,立即停止
[root@localhost ~]#vim test.sh#/bin/bashset -u
DIR=/opt
rm -rf $DIr/*[root@localhost ~]#bash test.sh
test.sh:行5: DIr: 為綁定變量
3.重定向和管道符
3.1重定向
標準輸入和標準輸出
ls是標準輸入? 標準輸出是打印在當前終端屏幕上的
類型 | 設(shè)備文件 | 文件描述編號 | 默認設(shè)備 |
標準輸入 | /dev/stdin | 0 | 鍵盤 |
標準輸出 | /dev/stdout | 1 | 顯示器 |
標準錯誤輸出 | /dev/stderr | 2 | 顯示器 |
交互式硬件設(shè)備
- 標準輸入:從該設(shè)備接收用戶輸入的數(shù)據(jù)
- 標準輸出:通過該設(shè)備向用戶輸出數(shù)據(jù)
- 標準錯誤:通過該設(shè)備報告執(zhí)行出錯信息
重定向的意思就是 ,不輸出到默認設(shè)備上,輸出到你指定的位置
類型 | 操作符 | 用途 |
重定向輸入 | < | 從指定的文件讀取數(shù)據(jù),而不是從鍵盤輸入 |
重定向輸出 | 1> | 將輸出結(jié)果保存到指定的文件(覆蓋原有內(nèi)容) |
>> | 將輸出結(jié)果追加到指定的文件尾部 | |
標準錯誤輸出 | 2> | 將錯誤信息保存到指定的文件(覆蓋原有內(nèi)容) |
2>> | 標準錯誤輸出結(jié)果追加到指定的文件尾部 | |
混合輸出 | &>無論對錯都可以重定向 | 將標準輸出、標準錯誤的內(nèi)容保存到同一個文件中 |
[root@localhost ~]#ls /dev/pts/1
/dev/pts/1
#ls命令最終顯示到終端 標準重定向省略了1>[root@localhost ~]#xxx >/dev/pts/1
bash: xxx: 未找到命令...
#錯誤重定向[root@localhost ~]#rm xxx.txt >/dev/pts/1
rm: 無法刪除"xxx.txt": 沒有那個文件或目錄
#錯誤重定向
[root@localhost ~]#vim passwd.txt123321[root@localhost ~]#setenforce 0
setenforce: SELinux is disabled[root@localhost ~]#passwd --stdin ghd < passwd.txt
更改用戶 ghd 的密碼 。
passwd:所有的身份驗證令牌已經(jīng)成功更新。
[root@localhost ~]#cat passwd.txt
123321
[root@localhost ~]#echo "123321" > passwd.txt
[root@localhost ~]#cat passwd.txt
123321
[root@localhost ~]#ls > passwd.txt
[root@localhost ~]#cat passwd.txt
all.log
anaconda-ks.cfg
initial-setup-ks.cfg
passwd.txt
webmin-2.100-1.noarch.rpm
公共
模板
視頻
圖片
文檔
下載
音樂
桌面
3.1.1延伸
#不能將正確和錯誤一起顯示出來
[root@centos7 ~]#ls /data /xxx 1> /data/all.log 2>&1
[root@centos7 ~]#ls /data /xxx 2> /data/all.log 1>&2
[root@centos7 ~]#ls /data /xxx &> /data/all.log
[root@centos7 ~]#ls /data /xxx >& /data/all.log [root@centos7 ~]#ls /data /xxx 2>&1 1> /data/all.log
#不可以顯示出來1代表 正確輸入
2代表 錯誤輸入
& 代表混合
3.2多行重定向
Here Document 概述 使用 I/O 重定向的方式將命令列表提供給交互式程序或命令,比如 ftp、cat 或 read 命令。 HereDocument是標準輸入的一種替代品, 可以幫助腳本開發(fā)人員不必使用臨時文件來構(gòu)建輸入信息, 而是直接就地生產(chǎn)出一個文件并用作命令的標準輸入。
[root@localhost opt]#wc -l <<EOF
123
321
eof
EOF
3[root@localhost opt]#cat > cxk.txt
#需要回車才可以寫入
123
321
cxk
^C
[root@localhost opt]#ls
cxk.txt
[root@localhost opt]#ls cxk.txt
cxk.txt
[root@localhost opt]#cat cxk.txt
123
321
cxk[root@localhost opt]#cat >test.txt <<EOF
> 111
> 222
> 333
> cxk
> EOF
[root@localhost opt]#ls
cxk.txt test.txt
[root@localhost opt]#cat test.txt
111
222
333
cxk
3.3管道符
管道操作符號“ |?”
將左側(cè)的命令輸出結(jié)果,作為右側(cè)命令的處理對象
[root@localhost ~]#grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
ghd:x:1000:1000:ghd:/home/ghd:/bin/bash[root@localhost ~]#grep "bash$" /etc/passwd|awk -F: '{print $1,$7}'
root /bin/bash
ghd /bin/bash[root@localhost opt]# echo "123123" |passwd --stdin ghd
更改用戶 ghd 的密碼 。
passwd:所有的身份驗證令牌已經(jīng)成功更新
4.特殊符號
- 賦值時使用雙引號(" ")可以直接調(diào)用變量
- 賦值時使用單引號(' ')變量$只會被認為是字符$ 不會調(diào)用變量
- 賦值時使用(``反撇在tab上面)命令替換,提取命令執(zhí)行后的輸出結(jié) 果 和$( ) 用法相同
- {}可以分隔變量值
雙引號 | 弱引用 | 可以識別變量 |
單引號 | 強引用 | 不能識別變量 |
{? } | 定義變量名的范圍 | |
''(反撇) | 調(diào)用命令的執(zhí)行結(jié)果(? 反撇=$()? ) |
[root@localhost ~]#name=cxk
[root@localhost ~]#name1=wyq
[root@localhost ~]#echo $name1
wyq
[root@localhost ~]#echo name
name
[root@localhost ~]#echo $name
cxk
[root@localhost ~]#echo $name$name1
cxkwyq
[root@localhost ~]#echo ${name1}name
wyqname
#建議帶著{}弱引用 強引用
[root@localhost ~]#echo "$name1"
wyq[root@localhost ~]#echo '$name1'
$name1[root@localhost ~]#date
2024年 01月 23日 星期二 14:40:50 CST
[root@localhost ~]#date +%F
2024-01-23
[root@localhost ~]#touch `date +%F`
[root@localhost ~]#ls 2024-01-23
2024-01-23[root@localhost ~]#df
文件系統(tǒng) 1K-塊 已用 可用 已用% 掛載點
/dev/mapper/centos-root 52403200 5265668 47137532 11% /
devtmpfs 917604 0 917604 0% /dev
tmpfs 933524 0 933524 0% /dev/shm
tmpfs 933524 9208 924316 1% /run
tmpfs 933524 0 933524 0% /sys/fs/cgroup
/dev/sda1 5232640 182368 5050272 4% /boot
tmpfs 186708 0 186708 0% /run/user/0
tmpfs 186708 12 186696 1% /run/user/42
[root@localhost ~]#df |grep sda
/dev/sda1 5232640 182368 5050272 4% /boot
[root@localhost ~]#df |grep sda|tr -s " "|cut -d" " -f5
4%
[root@localhost ~]#df |grep sda|tr -s " "|cut -d" " -f5|tr -d %
4
[root@localhost ~]#use=`df |grep sda|tr -s " "|cut -d" " -f5|tr -d %`
[root@localhost ~]#echo $use
4[root@localhost ~]#name=root
[root@localhost ~]#grep '$name' /etc/passwd
[root@localhost ~]#grep ''$name'' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]#grep ' ' $name ' ' /etc/passwd
5.變量
5.1變量的作用
用來存放系統(tǒng)和用戶需要使用的特定參數(shù)
- 變量名:使用固定的名稱,由系統(tǒng)預(yù)設(shè)或用戶定義
- 變量值:能夠根據(jù)用戶設(shè)置、系統(tǒng)環(huán)境的變化而變化
變量的類型
- 自定義變量:由用戶自己定義、修改和使用
- 特殊變量:環(huán)境變量,只讀變量,位置變量,預(yù)定義變量
[root@localhost ~]#a=wyq
[root@localhost ~]#echo $a
wyq
[root@localhost ~]#a=cxk
[root@localhost ~]#echo $a
cxk
常見的Shell變量的類型
- 自定義變量:由用戶自己定義,修改和使用
- 預(yù)定義變量:Bash中內(nèi)置的一類變量
- 環(huán)境變量:由系統(tǒng)維護,用于設(shè)置工作環(huán)境? 當前目錄? 當前主機名? $PATH
- 只讀變臉:只可以讀取不可以更改
- 位置變量:通過命令性給腳本傳遞參數(shù)
系統(tǒng)內(nèi)置變量:PATH,UID,HOSTNAME,USER
5.2命名要求
- 區(qū)分大小寫
- 不能使程序中的保留字和內(nèi)置變量:如:if, for,hostname 命令 a=
- 只能使用數(shù)字、字母及下劃線,且不能以數(shù)字開頭,注意:不支持短橫線 “ - ”,和主機名相反
- 不要使用內(nèi)置的變量,使用英文盡量使用詞義通俗易懂,PATH
- 大駝峰 StudentFirstName
- 小駝峰 studentFirstName
- 下劃線 student_name
特殊符號
- 賦值時使用雙引號(" ")可以直接調(diào)用變量(雙引號 弱引用 可以識別變量)
- 賦值時使用單引號(' ')變量$只會被認為是字符$ 不會調(diào)用變量(單引號 強引用 不能識別變量)
- 賦值時使用(``反撇在tab上面)命令替換,提取命令執(zhí)行后的輸出結(jié) 果 和$( ) 用法相同(反撇 調(diào)用命令的執(zhí)行結(jié)果 反撇=$())
- {}可以分隔變量值({ } 定義變量名的范圍)
5.3定義變量
- 變量名=變量值
調(diào)用變量
- echo $變量名
取消變量
- unset 變量名
[root@localhost ~]#a=cxk
[root@localhost ~]#echo $a
cxk
[root@localhost ~]#unset a
[root@localhost ~]#echo $a
5.4只讀變量
[root@localhost ~]#name=wsc
[root@localhost ~]#echo $name
wsc
[root@localhost ~]#readonly name
[root@localhost ~]#name=cxk
-bash: name: 只讀變量
[root@localhost ~]#echo $name
wsc
[root@localhost ~]#unset name
-bash: unset: name: 無法反設(shè)定: 只讀 variable
[root@localhost ~]#reboot[root@localhost ~]#echo $name#重啟之后就會失效
5.5自定義變量(約等于別名)
定義一個新的變量
- 變量名以字母或下劃線開頭,區(qū)分大小寫,建議全大寫
- 變量名=變量值
查看變量值
- echo $變量名
[root@localhost ~]#myls=ls
[root@localhost ~]#ls
anaconda-ks.cfg webmin-2.100-1.noarch.rpm 模板 圖片 下載 桌面
initial-setup-ks.cfg 公共 視頻 文檔 音樂
[root@localhost ~]#$myls
anaconda-ks.cfg webmin-2.100-1.noarch.rpm 模板 圖片 下載 桌面
initial-setup-ks.cfg 公共 視頻 文檔 音樂
5.6變量追加值(+=)
[root@localhost ~]#name=wyq
[root@localhost ~]#echo $name
wyq
[root@localhost ~]#name+=cxk
[root@localhost ~]#echo $name
wyqcxk#修改環(huán)境變量
PATH+=:/data[root@localhost ~]#vim /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data"
5.7交互的定義變量
read -p交互式的輸入變量值
[root@localhost ~]#vim test.sh#/bin/bash
read -p "請輸入密碼:" numberecho $number[root@localhost ~]#bash test.sh
請輸入密碼:123
123[root@localhost ~]#vim test.sh#/bin/bash
read -p "請輸入ip地址檢測主機連通性:" time
ping -c2 $time[root@localhost ~]#bash test.sh
請輸入ip地址檢測主機連通性:192.168.241.11
PING 192.168.241.11 (192.168.241.11) 56(84) bytes of data.
64 bytes from 192.168.241.11: icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from 192.168.241.11: icmp_seq=2 ttl=64 time=0.089 ms--- 192.168.241.11 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.062/0.075/0.089/0.016 ms
5.8變量作用范圍
- 默認情況下,新定義的變量只在當前的shell環(huán)境中有效,因此稱為局部變量,當進入子程序或新的shell環(huán)境中,局部變量將無法再起作用。
- 可以通過內(nèi)部命令export將指定的變量為全局變量,使用戶定義的變量在所子shell環(huán)境中可以繼續(xù)使用
設(shè)置變量的作用范圍
方法
- 格式1:export 變量名
- 格式2:export 變量名=變量值
可以使用pstree 查看shell的環(huán)境;
輸入bash進入子shell;
ctrl+D組合exit 退出子shel。
[root@localhost ~]#export name
[root@localhost ~]#echo $name
wyqcxk
[root@localhost ~]#echo $Product $Version[root@localhost ~]#bash
[root@localhost ~]#pstree -p|grep bash|-sshd(980)---sshd(1631)---bash(1639)---bash(2370)-+-grep(2409)
[root@localhost ~]#env
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.241.1 53690 22
SSH_TTY=/dev/pts/0
USER=root
name=wyqcxk
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/root
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
HOME=/root
SHLVL=2
LOGNAME=root
SSH_CONNECTION=192.168.241.1 53690 192.168.241.11 22
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
LESSOPEN=||/usr/bin/lesspipe.sh %s
DISPLAY=localhost:10.0
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env[root@localhost ~]#exit[root@localhost ~]#env
XDG_SESSION_ID=7
HOSTNAME=localhost.localdomain
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.241.1 60953 22
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
SSH_CONNECTION=192.168.241.1 60953 192.168.241.11 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
DISPLAY=localhost:10.0
_=/usr/bin/env
可以在定義的時候加export
也可以在定義完之后 開啟子環(huán)境之后再加export
6.整數(shù)運算
6.1expr——只能進行整數(shù)運算(乘*需要加轉(zhuǎn)義\)
[root@localhost ~]#expr 1+2
1+2
[root@localhost ~]#expr 1 + 2
3
[root@localhost ~]#expr 5 - 2
3
[root@localhost ~]#expr 5 / 2
2
[root@localhost ~]#expr 5 * 2
expr: 語法錯誤
[root@localhost ~]#expr 5 \* 2
10
[root@localhost ~]#expr 6 / 2
3
6.2bc計算器——交互式的進行算數(shù)(支持非整數(shù))
[root@localhost ~]#bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1*6
6
2*5
10
1+5+95+5+
(standard_in) 4: syntax error
1+5+95+5
106
9/3
3
6.3+5.8+3.6
15.7
6.3let——只支持整數(shù)運算
[root@localhost ~]#let sum=1+6
[root@localhost ~]#echo $sum
7
[root@localhost ~]#let sum=5*5
[root@localhost ~]#echo $sum
25
[root@localhost ~]#let sum=6*3;echo $sum
18
6.4((num=x+x))——支持整數(shù)運算
[root@localhost ~]#((num=5+5))
[root@localhost ~]#((sum=1+2))
[root@localhost ~]#echo $sum
3
[root@localhost ~]#echo $num
10
6.5sum=$[x*x]——支持整數(shù)運算
[root@localhost ~]#sum=$[5*5]
[root@localhost ~]#echo $sum
25
[root@localhost ~]#sum=$[9*6];echo $sum
54
建議使用let和sum$
[root@localhost ~]#let sum=1+9;echo $sum
10
[root@localhost ~]#sum=$[1+9];echo $sum
10
6.6延伸——變量的運算
[root@localhost ~]#a=10
[root@localhost ~]#b=5
[root@localhost ~]#expr $a + $b
15
[root@localhost ~]#let sum=$a*$b;echo $sum
50
[root@localhost ~]#sum=$[a*b];echo $sum
50
7.RANDOM——隨機數(shù)生成器
[root@localhost ~]#man bashRANDOM 每次引用這個參數(shù)時,都會產(chǎn)生一個 0 到 32767之間的隨機整數(shù)??梢酝ㄟ^向 RANDOM賦值來初始化隨機數(shù)序列。如果取消了 RANDOM的定義,它就失去了特殊的意義,即使后來重新定義它。
RANDOM取值范圍是0-32767
[root@localhost ~]#echo $RANDOM
13461
[root@localhost ~]#echo $RANDOM
12383
[root@localhost ~]#echo $RANDOM
22935
[root@localhost ~]#echo $RANDOM
23980
[root@localhost ~]#echo $RANDOM
27897
[root@localhost ~]#echo $RANDOM
25217
[root@localhost ~]#echo $RANDOM
2245
7.1延伸
[root@localhost ~]#echo $[RANDOM%10]
9
[root@localhost ~]#echo $[RANDOM%10]
5
[root@localhost ~]#echo $[RANDOM%10]
8
[root@localhost ~]#echo $[RANDOM%10]
6
[root@localhost ~]#echo $[RANDOM%10]
0
[root@localhost ~]#echo $[RANDOM%10]
9
[root@localhost ~]#echo $[RANDOM%10]
5#表示隨機生成小于10的數(shù)字 范圍是0-9[root@localhost ~]#echo $[RANDOM%10+1]
8
[root@localhost ~]#echo $[RANDOM%10+1]
8
[root@localhost ~]#echo $[RANDOM%10+1]
1
[root@localhost ~]#echo $[RANDOM%10+1]
1
[root@localhost ~]#echo $[RANDOM%10+1]
8
[root@localhost ~]#echo $[RANDOM%10+1]
8
[root@localhost ~]#echo $[RANDOM%10+1]
1
[root@localhost ~]#echo $[RANDOM%10+1]
7
[root@localhost ~]#echo $[RANDOM%10+1]
10
[root@localhost ~]#echo $[RANDOM%10+1]
10#表示隨機生成小于10的數(shù)字 范圍是1-10
8.修改顏色
8.1顏色修改
[root@localhost ~]#echo -e "\E[1;30mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;31mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;32mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;33mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;34mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;35mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;36mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;37mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;38mhello world\E[0m"
hello world
8.2隨機顏色
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
8.3延伸——打印當前系統(tǒng)信息
[root@localhost ~]#vim system_info.sh#/bin/bash
host=`ifconfig ens33|grep netmask|tr -s " "|cut -d " " -f3`
name=`hostname`
cpu=`lscpu|grep 型號名稱|tr -s " "|cut -d " " -f2-8`
test=`uname -r`
os=`cat /etc/redhat-release`
disk=`lsblk|grep disk|tr -s " "|cut -d " " -f4`
mem=`free -h|grep Mem|awk '{print $2}'`echo -e "\E[1;32m-------------system info-------------\E[0m"echo "主機名: $name"
echo "IP地址: $host"
echo "cpu型號: $cpu"
echo "內(nèi)核版本: $test"
echo "系統(tǒng)類型: $os"
echo "磁盤大小: $disk"
echo "內(nèi)存大小: $mem"echo -e "\E[1;36m------------- end -------------\E[0m"[root@localhost ~]#bash system_info.sh
-------------system info-------------
主機名: localhost.localdomain
IP地址: 192.168.241.11
cpu型號: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
內(nèi)核版本: 3.10.0-693.el7.x86_64
系統(tǒng)類型: CentOS Linux release 7.4.1708 (Core)
磁盤大小: 60G
內(nèi)存大小: 1.8G
------------- end -------------
小拓展
[root@localhost ~]#lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
座: 2
NUMA 節(jié)點: 1
廠商 ID: GenuineIntel
CPU 系列: 6
型號: 142
型號名稱: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
步進: 10
CPU MHz: 1990.571
BogoMIPS: 3984.00
超管理器廠商: VMware
虛擬化類型: 完全
L1d 緩存: 32K
L1i 緩存: 32K
L2 緩存: 256K
L3 緩存: 8192K
NUMA 節(jié)點0 CPU: 0,1
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat
[root@localhost ~]#lscpu |grep 型號名稱
型號名稱: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
[root@localhost ~]#lscpu |grep 型號名稱|tr -s " "|cut -d " " -f2
Intel(R)
[root@localhost ~]#lscpu |grep 型號名稱|tr -s " "|cut -d " " -f2-8
Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
[root@localhost ~]#lscpu |grep 型號名稱|tr -s " "|cut -d ":" -f2-8
型號名稱: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
[root@localhost ~]#lscpu |grep 型號名稱|tr -s " "|cut -d ":" -f2
型號名稱: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
9.環(huán)境變量
- 由系統(tǒng)提前創(chuàng)建,用來設(shè)置用戶的工作環(huán)境
- 可以使用env查看環(huán)境變量
- 需要記住的常用環(huán)境變量
- 配置文件:/etc/profile、~/.bash_profile
/etc/profile如果修改此文件會作用于所有用戶
~/.bash_profile 用戶獨立的配置文件,修改這個文件只作用于當前用戶
常見的環(huán)境變量:PWD、PATH、USER、SHELL、HOME
[root@localhost ~]#echo $PATH
#表示可執(zhí)行用戶程序的默認路徑
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]#echo $PWD
#表示當前所在工作目錄
/root
[root@localhost ~]#echo $USER
#表示用戶名稱
root
[root@localhost ~]#echo $SHELL
#表示使用SHELL類型
/bin/bash
[root@localhost ~]#echo $HOME
#表示用戶的宿主目錄
/root
定義環(huán)境變量
[root@localhost ~]#export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data"
[root@localhost ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data
環(huán)境變量
- 可以使子進程(包括孫子進程)繼承父進程的變量,但是無法讓父進程使用子進程的變量
- 一旦子進程修改從父進程繼承的變量,將會新的值傳遞給孫子進程
- 一般只在系統(tǒng)配置文件中使用,在腳本中較少使用
?10.位置變量
位置變量也稱為位置參數(shù),使用$1、$2、$3、…、$9 表示
[root@localhost ~]#vim test.sh#!/bin/bash
echo $1
echo $2
echo $3[root@localhost ~]#bash test.sh a b c d e
a
b
c[root@localhost ~]#bash test.sh {a..z}
a
b
c
[root@localhost ~]#bash test.sh {1..10}
1
2
3[root@localhost ~]#vim test.sh#!/bin/bash
echo $1
echo $2
echo $3
echo ${10}[root@localhost ~]#bash test.sh {1..10}
1
2
3
10
[root@localhost ~]#bash test.sh {1..20}
1
2
3
10[root@localhost ~]#vim test.sh#!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
echo $10[root@localhost ~]#bash test.sh {a..z}
a
b
c
j
a0[root@localhost ~]#vim test.sh #!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
echo $10
echo $*
echo $@[root@localhost ~]#bash test.sh {a..z}
a
b
c
j
a0
a b c d e f g h i j k l m n o p q r s t u v w x y z[root@localhost ~]#bash test.sh {a..z}
a
b
c
j
a0
a b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@localhost ~]#bash test.sh {1..10}
1
2
3
10
10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10[root@localhost ~]#vim test.sh #!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
echo $10
echo $*
echo $@
echo $0[root@localhost ~]#bash test.sh {1..10}
1
2
3
10
10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
test.sh[root@localhost ~]#vim test.sh #!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
echo $10
echo $*
echo $@
echo $0
echo $#[root@localhost ~]#bash test.sh {1..10}
1
2
3
10
10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
test.sh
10
[root@localhost ~]#bash test.sh {1..20}
1
2
3
10
10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
test.sh
20
[root@localhost ~]# vim 1.sh
#!/bin/bash
echo "$1" 位置1
echo "$2" 位置2
echo "${10}" 位置10
echo "$10" 位置1和0
echo "$*" 將所有項當成一個值
echo "$@" 所有項
echo "$0" 腳本自身
echo "$#" 后面參數(shù)的個數(shù)
11.預(yù)定義變量
- $*:表示所有位置參數(shù)的內(nèi)容看成一個整體返回 返回所有
- $@:表示所有位置參數(shù)的內(nèi)容分割成n份,每份作為一個獨立的個體返回 返回所有
- $?:表示前一條命令執(zhí)行后的返回狀態(tài),返回值為 0 表示執(zhí)行正確,返回任何非 0值均表示執(zhí)行出現(xiàn)異常
- $#:表示命令行中位置參數(shù)的總個數(shù)
- $0:表示當前執(zhí)行的腳本或程序的名稱 當前腳本的名字
- $$:當前bash的進程id
- $!: 后臺任務(wù)最后一個id
12.延伸——()和{}
()
[root@localhost ~]#ls
anaconda-ks.cfg test.sh 模板 文檔 桌面
initial-setup-ks.cfg webmin-2.100-1.noarch.rpm 視頻 下載
system_info.sh 公共 圖片 音樂
[root@localhost ~]#cd /opt;ls
cxk
[root@localhost opt]#cd
[root@localhost ~]#(cd /opt;ls)
cxk
{}
[root@localhost ~]#ls
anaconda-ks.cfg test.sh 模板 文檔 桌面
initial-setup-ks.cfg webmin-2.100-1.noarch.rpm 視頻 下載
system_info.sh 公共 圖片 音樂
[root@localhost ~]#(cd /opt;mkdir wyq)
[root@localhost ~]#ls /opt
cxk wyq
[root@localhost ~]#{ cd /opt;touch wyq }
> ^C
[root@localhost ~]#{ cd /opt;touch wyq; }
[root@localhost opt]#ls
cxk wyq
[root@localhost opt]#ll
總用量 0
drwxr-xr-x 2 root root 6 1月 23 18:13 cxk
drwxr-xr-x 2 root root 6 1月 23 18:33 wyq
[root@localhost opt]#{ cd /opt;touch wyq1; }
[root@localhost opt]#ls
cxk wyq wyq1
總結(jié)
()表示執(zhí)行過,直接顯示結(jié)果;{}要執(zhí)行操作,也顯示結(jié)果;
()不需要結(jié)尾;{}需要;結(jié)尾;
()會開啟子進程;{}不會開啟子進程。
補充
[root@localhost ~]#name=cxk
[root@localhost ~]#(name=cxk;echo $name);echo $name
cxk
cxk[root@localhost ~]#{ name=cxk;echo $name; };echo $name
cxk
cxk