shell腳本基礎
格式要求:首行shebaang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell腳本用途:
自動化經常使用命令
執行系統管理和故障排除
建立簡單的應用程序
處理文本或文件
bash中變量的種類
局部變量:生效範圍爲當前shell進程;對當前shell以外的其餘shell進程,包括當前shell的子shell進程均無效
環境變量:生效範圍爲當前shell進程及其子進程
本地變量:生效範圍爲當前shell進程中某代碼片斷,一般指函數
位置變量:$1,$2,$3,...來表示,用於讓腳本在腳本代碼中調用經過命令行傳遞給它的參數
特殊變量:$?,$0,$,$@,$#,$$,$!
變量賦值: name=root 變量疊加name="$name"hello
變量引用: $name 或者 ${name}
弱引用: " " 其中的變量引用會被替換爲變量值
強引用: ' ' 其中的變量引用不會被替換爲變量值,而保持原字符串
set: 顯示已定義的全部變量
unset name: 刪除變量
例:編寫腳本顯示當前主機信息
#!/bin/bash
aa=$[RANDOM%7+31]
bb="\e[1;${aa}m"
cc="\e[0m"
ipv4=$(ifconfig|sed -n '2p'|sed -r "s/.inet //"|sed -r "s/ .//")
echo "當前主機系統信息以下:"
echo -e 主機名: $bb$(hostname)$cc
echo -e ipv4地址:$bb$ipv4$cc
echo -e 操做系統版本: $bb$(cat /etc/redhat-release|cut -d. -f1-2)$cc
echo -e 內核版本 $bb$(uname -r)$cc
echo -e CPU型號:$bb$(lscpu |grep "Model name"|tail -n1|tr -s " "|cut -d ":" -f2)$cc
echo -e 內存大小:$bb$(free -mh|head -n2|tail -n1|tr -s " "|cut -d " " -f2)$cc
echo -e 硬盤容量:$bb$(fdisk -l|head -n2|tail -n1|cut -d, -f1|cut -d " " -f2-4)$cc
環境變量的聲明、賦值:
export name=VALUE
顯示全部環境變量:
env、printenv、export、declare -x
刪除變量:
unset name
BASH內建的環境變量:
PATH、SHELL、USER、UID、HOME、PWD、SHLVL、LANG、MAIL、HOSTNAME、HISTSIZE、_下劃線
只讀變量:只能聲明,但不能修改和刪除
聲明只讀變量:
readonly name 、declare -r name
查看只讀變量:
readonly -p
$1,$2,$3,..對應第一、第二、第3的參數
$0, 表明命令自己
$, 傳遞給腳本的全部參數,所有參數合爲一個字符串
$@, 傳遞給腳本的全部參數,每一個參數爲獨立字符串
$#, 傳遞給腳本的參數的個數
set -- 清空全部位置變量
$? 進程使用退出狀態來報告成功或失敗,0表明成功,1-255表明失敗
bash有內建的隨機數生成器變量:$RANDOM(0-32767)
例:計算/etc/passwd文件中第10和第20個用戶的uid之和
##!/bin/bash
id1=$(cat /etc/passwd|head -n10|tail -n1|cut -d: -f3)
id2=$(cat /etc/passwd|head -n20|tail -n1|cut -d: -f3)
sum=$(($id1+$id2))
echo $sum python
邏輯運算
true 1 , false 0
與:
1 與 1 = 1
1 與 0 = 0
0 與 1 = 0
0 與 0 = 0
或
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0
非
!
測試命令: test EXPRESSION、[ EXPRESSION ] 、[[ EXPRESSION ]]
bash的數值測試
-v VAR 變量VAR是否設置
-gt 是否大於
-ge 是否大於等於
-eq 是否等於
-ne 是否不等於
-lt 是否小於
-le 是否小於等於
bash的字符串測試
= 是否等於
> ascii碼是否大於ascii碼
< 是否小於
!= 是否不等於
=~ 左側字符串是否可以被右側的PATTERN,此表達式通常用於[[]]中;擴展的正則表達式。
-z 字符串是否爲空,空爲真
-n 字符串是否不爲空,不空爲真 (用於字符串比較時用到的操做都應該使用引號)
bash的文件測試
-e 判斷文件是否存在,存在爲真
-b 判斷是否爲塊設備文件
-c 判斷是否爲字符設備文件
-d 判斷是否爲目錄文件
-f 判斷是否爲普通文件
-L或-h判斷是否爲符號鏈接文件
-p 判斷是否爲管道文件
-S 判斷是否爲套接字文件
bash的文件權限測試
-r 判斷是否可讀
-w 判斷是否可寫
-x 判斷是否可執行
-u 判斷是否擁有suid權限
-g 判斷是否擁有sgid權限
-k 判斷是否擁有sticky權限
bash的文件屬性測試
-s 是否存在而且非空
-t 文件描述符是否在某終端已經打開
-N 文件自從上一次被讀取以後是否被修改過
-O 當前有效用戶是否爲文件屬主
-G 當前有效用戶是否爲文件屬組
file1 -ef file2 file1是不是file2的硬連接
file1 -nt file2 file1是否比file2新
file1 -ot file2 file1是否比file2舊
bash的組合測試條件
EXPRESSION1 -a EXPRESSION2 而且
EXPRESSION1 -o EXPRESSION2 或者
COMMAND1 && COMMAND2 而且,短路與
COMMAND1 || COMMAND2 或者,短路或
!COMMAND 非
如 :[ -f "$FILE" ]&&[[ "$FILE" =~ .*.sh$ ]]
read輸入命令
-p 指定要顯示的提示
-s 靜默輸入,通常用於密碼
-n 指定輸入的字符長度
-d ‘字符’ 輸入結束符
-t 等待輸入的時間
echo abc | { read x y z;echo $x$y$z;} 使用管道 read會開啓子shell linux
條件選擇if語句
單分支
if 判斷條件;then
條件爲真的分支代碼
fi
例:
#!/bin/bash
sda5=$(df -h|grep /dev/sda5|awk '{print$5}'|tr -d "%")
if [ $sda5 -ge 80 ]
then
echo "warning! /dev/sda5 is full"
fi 正則表達式
雙分支
if 判斷條件;then
條件爲真的分支代碼
else
條件爲假的分支代碼
fi
例:
#!/bin/bash
date=$(date "+%y%m%d")
size=$(du -sh /etc)
if [ -d /tmp/back ]
then
echo "date:$date">/tmp/back/info.log
echo "size:$size">>/tmp/back/info.log
cd /tmp/back
tar -zcvf etc-$date.tar.bz2 /etc info.log &>/dev/null
rm -rf /tmp/back/info.log
else
mkdir /tmp/back
echo "date:$date">/tmp/back/info.log
echo "size:$size">>/tmp/back/info.log
cd /tmp/back
tar -zcvf etc-$date.tar.bz2 /etc info.log &>/dev/null
rm -rf /tmp/back/info.log
fi shell
多分支
if 判斷條件1;then
條件爲真的分支代碼
elif 判斷條件2;then
條件2爲真的分支代碼
elif 判斷條件3;then
條件3爲真的分支代碼
else
以上條件都爲假的分支代碼
fi centos
條件判斷;case語句
case $變量 in
"選項1")
命令1
;;
"選項2")
命令2
;;
*)
命令3
;;
esac 緩存
bash的配置文件
全局配置:
/etc/profile
/etc/profile.d/.sh
/etc/bashrc
我的配置:
~/.bash_profile
~/.bashrc
shell 登陸兩種方式
交互式登陸:
執行順序:/etc/profile --> /etc/profile.d/.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登陸:
執行順序:/etc/profile.d/*.sh --> /etc/bashrc --> ~/.bashrc
profile類:爲交互式登陸的shell提供配置
bashrc類:爲非交互式和交互式登陸的shell提供配置 bash
local命令
-i 不區分大小寫的搜索
-n N 只列舉前N個匹配項目
-r 使用基本正則表達式
find 路徑 條件 動做
-maxdepth 最大搜索深度
-mindepth 最小搜索深度
-depth 先處理目錄裏文件,再處理目錄
-regex 正則表達式
-path 不搜索目錄裏文件
-perm 600 精準權限查找
-perm -444 u g o 三者都有讀權限
-perm + centos7改成/
-perm /222 u g o 三者有一個有寫權限就能夠
-ok-exec {} \; 對查找的結果進行處理
-empty 空
參數替換 xargs
echo {1..100}|xargs -n1
echo user{1..10}|xargs -n1 useradd
壓縮、解壓縮
compress
-d 解壓縮
-c 結果輸出至標準輸出,不刪除源文件
-v 顯示詳情
zcat file.z zcat file.gz bzcat file.bz2 xzcat file.xz 不顯示解壓縮的前提下查看文本文件內容
cat m | gzip > m.gz
lscpu | gzip > cpu.gz
bzip2 -k 保留原文件
tar -zcvf .tar.gz
tar -jcvf .tar.bz2
tar -Jcvf .tar.xz
split 分割一個文件爲多個文件
rpm2cpio 包路徑 | cpio -idv ./路徑
-t預覽
ldd 查看依賴的庫 服務器
文本處理工具sed
選項:
-n 不輸出模式空間內容到屏幕,即不自動打印
-e 多點編輯
-r 支持使用擴展正則表達式
-i 原文編輯
-i.bak 備份文件並原處編輯
編輯命令:
d 刪除模式空間匹配的行,並當即啓用下一輪循環
p 打印當前模式空間內容,追加到默認輸出以後
a\ 在指定行後面追加文本,
i\ 在前面插入文本
c\ 替換行爲單行或多行文本
w 保存至指定文件
s/// 替換查找 g 行內全局替換 p顯示替換成功的行 w將替換成功的行保存至文件中 curl
rpm包管理
rpm -ivh 安裝並顯示詳細信息
rpm -qa 顯示全部包
rpm -qf 查詢指定文件在哪一個包裏
rpm -ql 查詢安裝位置
rpm -qR 查詢依賴
rpm -e 卸載
rpm -V 包校驗
yum 管理rpm包
yum源支持文件服務器 http、https、ftp、file
yum配置文件 /etc/yum.repos.d/.repo
yum -y install 包名 安裝軟件
yum search 包名 查詢軟件
yum -y reinstall 從新安裝
yum repolist 顯示倉庫列表
yum remove 卸載程序包
yum update 升級程序包
yum info 查看程序包
yum clean all 清除緩存
ym history 查看安裝歷史
yum history info
yum history undo 撤銷
yum history redo 重裝
createrrepo 生成repodate
curl IP 查看網頁內容
yum groupinstall......
dnf 新一代rpm軟件包管理器
安裝所需軟件包
dnf-conf-0.6.4-2.sdl7.noarch.rpm
dnf-0.6.4-2.sdl7.noarch.rpm
python-dnf-0.6.4-2.sdl7.noarch.rpm
配置文件:/etc/dnf/dnf.conf
倉庫文件:/etc/yum.repos.d/.repo
日誌:/var/log/dnf.rpm.log
編譯安裝
C語言源代碼編譯安裝三步驟:
一、./configure
二、make 根據Makefile文件,構建應用程序
三、make install 複製文件到相應路徑
開發工具:
autoconf: 生成configure腳本
automake:生成Makefile.in ide