Shell基本概述
1.shell入門
1)什么是shell 殼
命令解釋器 用戶輸入命令 解釋器負(fù)責(zé)解釋給內(nèi)核 處理后的結(jié)果 反饋用戶 稱為解釋
交互式shell 用戶輸入命令 解釋器解釋把處理后的結(jié)果反饋給用戶的過程稱為 交互式
非交互shell shell執(zhí)行文本中的命令 當(dāng)執(zhí)行到文件的末尾 bash退出
父shell 不能繼承子shell變量 子shell可繼承父shell變量
2)什么是shell腳本
把可執(zhí)行命令堆積到一個(gè)文本中則稱為shell腳本(條件表達(dá)式 for循環(huán) if判斷等等語(yǔ)句)
shell執(zhí)行方式
hello world!
執(zhí)行腳本的三種方式
1)bash test.sh
[root@web01 scripts]# bash test.sh
Hello World!
2)全路徑執(zhí)行
[root@web01 scripts]# chmod +x test.sh
[root@web01 scripts]# /server/scripts/test.sh
Hello World!
3). 或者source執(zhí)行
[root@web01 scripts]# . test.sh
Hello World!
[root@web01 scripts]# source test.sh
Hello World!
什么區(qū)別?
1 2 在子shell中執(zhí)行
. source 父進(jìn)程下執(zhí)行
環(huán)境變量
1.環(huán)境變量定義
什么是環(huán)境變量?
右邊一堆內(nèi)容,用一個(gè)名字來代替稱為環(huán)境變量
name="I am lizhenya"
如何查看環(huán)境變量? 名稱的前面加上name
如何查看系統(tǒng)定義好的環(huán)境變量
env set
如何取消環(huán)境變量?
unset name
環(huán)境變量(全局變量) 普通變量(局部變量)
按照生存周期劃分
永久性 修改配置文件 /etc/profile
臨時(shí)性 使用export 變量名稱 聲明即可
不加export 只對(duì)當(dāng)前的shell生效
加export 對(duì)當(dāng)前登錄窗口所有的shell生效
2.環(huán)境變量的相關(guān)文件
1. /etc/profile 開機(jī)或者新連接的窗口執(zhí)行一次
2. .bashrc
3. .bash_profile
4. /etc/bashrc
3.如何定義環(huán)境變量
變量名=變量值
環(huán)境變量名稱的定義 字符 下劃線 數(shù)字的組合 盡量以字母開頭(禁止使用數(shù)字開頭) 等號(hào)兩端不允許有空格 見名知其意
4.書寫方式
1. OLDBOY_AGE=18 系統(tǒng)中變量的定義格式
2. oldboy_age=18
3. oldboy_Age=18 小駝峰語(yǔ)法
4. Oldboy_Age=18 大駝峰語(yǔ)法
5.變量值的定義方式
1.數(shù)字定義
oldboy_age=18 連續(xù)的數(shù)字
2.字符串的定義
name="oldboy" 使用雙引號(hào) 不知道加什么符號(hào) 就加雙引號(hào) 解析變量
name='oldboy' 所見即所得 吃什么吐什么
3.命令的定義
time=`date` 反引號(hào) 里面必須跟可執(zhí)行命令
time=$(date) $()
[root@web01 scripts]# name=oldboy
[root@web01 scripts]# echo "$oldboyisok"
[root@web01 scripts]# echo "${oldboy}isok"
isok
[root@web01 scripts]# echo "${name}isok"
oldboyisok
[root@web01 scripts]# echo '${name}isok'
${name}isok
重要的特殊位置變量
$0 腳本的名稱,如果全路徑執(zhí)行腳本,則腳本名稱也帶全路徑 basename 獲取腳本的名稱 重要
案例: 給用戶提示如何使用此腳本
echo $"Usage: $0 {start|stop|status|restart|force-reload}"
$n 腳本的第n個(gè)參數(shù) $0被腳本名稱占用 從$1開始 $9以后 需要加{}
$# 代表了腳本的傳參的總個(gè)數(shù) 重要
案例:
[ $# -ne 2 ] && echo "你請(qǐng)輸入兩個(gè)參數(shù)" && exit
$* 腳本的所有的傳參的參數(shù) 如果不加雙引號(hào)則和$@相同 加上雙引號(hào)則把所有參數(shù)視為一個(gè)整體
$@ 腳本的所有的傳參的參數(shù) 如果不加雙引號(hào)則和$*相同加上雙引號(hào)則把所有參數(shù)視為獨(dú)立的參數(shù)
$* 和$@ 正常情況下一樣 循環(huán)體內(nèi)不同
$? 獲取上一條命令的結(jié)果 0為成功 非0 失敗 重要
$$ 獲取腳本的PID
案例
服務(wù)器運(yùn)行大量的名稱相同的腳本
echo $$ > /tmp/count.pid
$! 上一個(gè)在后臺(tái)運(yùn)行腳本的PID 調(diào)試使用
$_ 獲取腳本的最后一個(gè)參數(shù) 相當(dāng)于ESC .
傳參的三種方式
1)直接傳參
2)賦值傳參
3)read傳參
1.第一種傳參方式
sh a.sh $1
echo $1 $2
2.第二種傳參方式
name=$1
age=$2
echo $name $age
read -p "請(qǐng)輸入名字和年齡" name1 age1
echo $name1 $age1
3.使用read 傳參的方式 更改系統(tǒng)的主機(jī)名稱和IP地址的最后一位 192.168.12.X
案例:
#!/bin/sh
sdir="/etc/sysconfig/network-scripts/ifcfg-eth0"
sip=`cat /etc/sysconfig/network-scripts/ifcfg-eth0|awk -F. '/IPADDR/{print $NF}'|cut -c1`
read -p "請(qǐng)輸入主機(jī)名稱: " name
hostnamectl set-hostname $name
read -p "請(qǐng)輸入IP地址的最后一位: " ip
sed -i "s#$sip#$ip#g" $sdir
案例:
sh ping.sh www.baidu.com
ping www.baidu.com is ok
sh ping.sh www.xxxxx.com is error
[root@web01 scripts]# cat ping.sh
#!/bin/sh
read -p "請(qǐng)輸入一個(gè)網(wǎng)址: " url
ping -c 1 -W 1 $url >/dev/null 2>&1
[ $? -eq 0 ] && echo "ping $url is ok" || echo "ping $url is error"
變量的字符串知識(shí)
1.統(tǒng)計(jì)變量的長(zhǎng)度
[root@web01 scripts]# name="I am lizhenya"
[root@web01 scripts]# echo $name
I am lizhenya
[root@web01 scripts]# echo "I am lizhenya"
I am lizhenya
[root@web01 scripts]# echo "I am lizhenya"|wc -L
13
[root@web01 scripts]# echo $name|wc -L
13
[root@web01 scripts]# echo ${#name}
13
2.變量的切片
[root@web01 scripts]# echo ${name:0:1}
I
[root@web01 scripts]# echo ${name:2:2}
am
[root@web01 scripts]# echo ${name:0:1}
I
[root@web01 scripts]# echo ${name:1}
am lizhenya
[root@web01 scripts]# echo ${name:2:5}
am li
3.取字符串長(zhǎng)度
###I am lizhenya teacher I am 18
方法1
echo I am lizhenya teacher I am 18|wc -L
方法2
name="I am lizhenya teacher I am 18"
echo ${#name}
方法3
[root@web01 scripts]# expr length "$name"
29
方法4
[root@web01 scripts]# echo $name|awk '{print length}'
29
4.取字符串長(zhǎng)度小于3的
方法1
for循環(huán)方式
[root@web01 scripts]# cat for.sh
#!/bin/sh
for i in I am lizhenya teacher I am 18
do
[ ${#i} -lt 3 ] && echo $i
done
方法2
[root@web01 scripts]# echo I am lizhenya teacher I am 18|xargs -n1|awk '{if(length<3)print}'
I
am
I
am
18
方法3
[root@web01 scripts]# echo I am lizhenya teacher I am 18|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
5.變量的刪除和替換
從前往后刪除變量?jī)?nèi)容
[root@web01 scripts]# echo $url
www.sina.com.cn
[root@web01 scripts]# echo ${url#*.}
sina.com.cn
[root@web01 scripts]# echo ${url#*.*.}
com.cn
[root@web01 scripts]# echo ${url##*.}
cn
從后往前刪除變量?jī)?nèi)容
[root@web01 scripts]# echo $url
www.sina.com.cn
[root@web01 scripts]# echo ${url%.*}
www.sina.com
[root@web01 scripts]# echo ${url%%.*}
www
變量的替換
[root@web01 scripts]# echo $url
www.sina.com.cn
[root@web01 scripts]# echo ${url/w/a}
aww.sina.com.cn
[root@web01 scripts]# echo ${url/w/aa}
aaww.sina.com.cn
[root@web01 scripts]# echo ${url/w/a}
aww.sina.com.cn
[root@web01 scripts]# echo ${url//w/a}
aaa.sina.com.cn
[root@web01 scripts]# echo ${url/sina/baidu}
www.baidu.com.cn