趙縣網(wǎng)站建設(shè)公司seo jsbapp9
Shell概述
shell是一個(gè)命令行解釋器,它接收應(yīng)用程序/用戶(hù)命令,然后調(diào)用操作系統(tǒng)內(nèi)核
腳本入門(mén)
腳本格式
腳本以#!/bin/bash開(kāi)頭(指定解析器)
helloworld
# 創(chuàng)建腳本
[linux@localhost datas]$ cat helloworld.sh
#!/bin/bash
echo "hello huangxb"# 執(zhí)行腳本方式1
[linux@localhost datas]$ bash helloworld.sh
hello huangxb# 執(zhí)行腳本方式2
[linux@localhost datas]$ ./helloworld.sh
-bash: ./helloworld.sh: 權(quán)限不夠
方式1,本質(zhì)是bash解析器幫你執(zhí)行腳本,所以腳本本身不需要執(zhí)行權(quán)限;方式2,本質(zhì)是腳本自己需要執(zhí)行,所以需要執(zhí)行權(quán)限
多命令處理
- ?在linux家目錄下創(chuàng)建一個(gè)bangzhang.txt并在文件中寫(xiě)入"I IOVE YOU"字符
#!/bin/bash
cd /home/linux/
touch banzhang.txt
echo "I LOVE YOU" >> banzhang.txt
Shell中的變量
常用系統(tǒng)變量
$HOME $PWD $SHELL $USER
[linux@localhost datas]$ echo $HOME
/home/linux
[linux@localhost datas]$ echo $PWD
/home/linux/datas
[linux@localhost datas]$ echo $SHELL
/bin/bash
[linux@localhost datas]$ echo $USER
linux
自定義變量
基本語(yǔ)法
- 定義變量:變量=值?等號(hào)兩邊不能留有空格
- 撤銷(xiāo)變量:unset 變量
- 輸出變量:echo $變量
- 聲明靜態(tài)變量: readonly 變量,注意:不能unset
[linux@localhost datas]$ A=1
[linux@localhost datas]$ echo $A
1
[linux@localhost datas]$ unset A
變量定義規(guī)則
- 變量名稱(chēng)可以由字母,數(shù)字和下劃線組成,不能以數(shù)字開(kāi)頭,環(huán)境變量名建議大寫(xiě)
- 等號(hào)兩側(cè)不能有空格
- 在bash中,變量默認(rèn)類(lèi)型都是字符串類(lèi)型,無(wú)法直接進(jìn)行數(shù)值運(yùn)算
- 變量的值如果有空格,需要使用雙引號(hào)或單引號(hào)括起來(lái)
[linux@localhost datas]$ D="A B C"
[linux@localhost datas]$ echo $D
A B C
- 可把變量提升為全局變量,可供其他shell程序使用
export 變量
特殊變量
$n
$n (描述:n為數(shù)字,$0代表腳本名稱(chēng),10以?xún)?nèi)參數(shù)用$1-9 表 示 , 10 以 上 的 需 要 用 大 括 號(hào) 包 含 , 9表示,10以上的需要用大括號(hào)包含,9表示,10以上的需要用大括號(hào)包含,{10})
#!/bin/bash
echo "$0 $1 $2 $3"
$#
$# (功能描述:獲取所有輸入?yún)?shù)個(gè)數(shù),常用于循環(huán))
#!/bin/bash
echo "$0 $1 $2 $3"
echo $#
- $* (描述:代表命令行中所有的參數(shù),把所有參數(shù)看成一個(gè)整體)
- $@ (描述:也代表命令行中所有的參數(shù),不過(guò)把每個(gè)參數(shù)區(qū)分對(duì)待)
[linux@localhost datas]$ bash parameter.sh test1 test2
parameter.sh test1 test2
2
test1 test2
test1 test2
- 1
- 2
- 3
- 4
- 5
$?
$? (描述:最后一次執(zhí)行命令的狀態(tài),0:正確執(zhí)行)
運(yùn)算符
- $((運(yùn)算式)) 或 $[運(yùn)算式]
- expr +,-,\*,/,% 加減乘除取余
expr運(yùn)算符間要有空格
# 計(jì)算2+3
[linux@localhost datas]$ expr 2 + 3
5# 計(jì)算(2+3)*4
## 方式1
[linux@localhost datas]$ expr `expr 2 + 3` \* 4
20## 方式2
[linux@localhost datas]$ s=$[(2+3)*4]
[linux@localhost datas]$ echo $s
20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
條件判斷
基本語(yǔ)法
[condition] (注意 condition前后要有空格)
常用判斷條件
兩個(gè)整數(shù)之間比較
符號(hào) | 描述 |
---|---|
-lt | (less than)小于 |
-le | (less equal) 小于等于 |
-eq | (equal)等于 |
-gt | (greater than) 大于 |
-ge | (greater equal) 大于等于 |
-ne | (not equal) 不等于 |
文件權(quán)限判斷
- -r 有讀的權(quán)限
- -w 有寫(xiě)的權(quán)限
- -x 有執(zhí)行的權(quán)限
文件類(lèi)型判斷
- -f 文件存在并且是一個(gè)常規(guī)文件
- -e 文件存在
- -d 文件存在病是一個(gè)目錄
# 判斷23是否大于2
[linux@localhost datas]$ [ 23 -gt 2 ]
[linux@localhost datas]$ echo $?
0# 判斷helloworld.sh是否有寫(xiě)入權(quán)限
[linux@localhost datas]$ [ -w hellowrld.sh ]
[linux@localhost datas]$ echo $?
1# 判斷目錄中文件是否存在
[linux@localhost datas]$ [ -e /home/linux/datas ]
[linux@localhost datas]$ echo $?
0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
多條件判斷
&& ||
流程控制
IF判斷
[linux@localhost datas]$ cat if.sh
#!/bin/bash
if [ $1 -eq 1 ]
thenecho "班長(zhǎng)真帥"
elif [ $1 -eq 2 ]
thenecho "班長(zhǎng)真丑"
fi
[linux@localhost datas]$ bash if.sh 2
班長(zhǎng)真丑
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
case 語(yǔ)句
[linux@localhost datas]$ cat case.sh
#!/bin/bash
case $1 in
1)echo "班長(zhǎng)"
;;
2)echo "學(xué)習(xí)委員"
;;
3)echo "體育委員"
;;
esac
[linux@localhost datas]$ bash case.sh 2
學(xué)習(xí)委員
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
for循環(huán)
語(yǔ)法1
[linux@localhost datas]$ cat for.sh
#!/bin/bash
s=0
for((i=1;i<=100;i++))
dos=$[$s+$i]
done
echo $s
[linux@localhost datas]$ bash for.sh
5050
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
語(yǔ)法2
[linux@localhost datas]$ cat for2.sh
#!/bin/bash
for i in $*
doecho $i
done
[linux@localhost datas]$ bash for2.sh 1 2
1
2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
WHILE循環(huán)
[linux@localhost datas]$ cat while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
dos=$[$s + $i]i=$[$i + 1]
done
echo $s[linux@localhost datas]$ bash while.sh
5050
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
read讀取控制臺(tái)輸入
read(選項(xiàng))(參數(shù))
- 1
- -p 指定讀取值時(shí)的提示符
- -t 指定讀取值時(shí)等待的時(shí)間(秒)
# 提示7秒內(nèi),讀取控制臺(tái)輸入的名稱(chēng)
[linux@localhost datas]$ cat read.sh
#!/bin/bash
read -t 7 -p "在7s內(nèi)請(qǐng)輸入你的名字" NAME
echo $NAME
[linux@localhost datas]$ bash read.sh
在7s
- 1
- 2
- 3
- 4
- 5
- 6
- 7
函數(shù)
系統(tǒng)函數(shù)
basename
basename [string / pathname] [suffix] (描述:basename命令會(huì)刪掉所有的前綴包括最后一個(gè)‘/’字符,然后將字符串顯示出來(lái))
- 1
# 方式1
[linux@localhost datas]$ basename /home/linux/banzhang.txt
banzhang.txt# 方式2
[linux@localhost datas]$ basename /home/linux/banzhang.txt .txt
banzhang
dirname
dirname 文件絕對(duì)路徑 (描述:從給定的包含絕對(duì)路徑的文件名中去除文件名(非目錄的部分),然后返回剩下的路徑(目錄的部分))
- 1
[linux@localhost datas]$ dirname /home/linux/banzhang.txt
/home/linux
- 1
- 2
自定義函數(shù)
# 格式
[ function ] funname[()]
{Action:[return int;]
}
funname
# DESC 計(jì)算輸入兩個(gè)參數(shù)的值
[linux@localhost datas]$ cat sum.sh
#!/bin/bash
function sum(){s=0;s=$[$1 + $2]echo $s
}
read -p "input your param1:" P1
read -p "input your param2:" P2
sum $P1 $P2
[linux@localhost datas]$ bash sum.sh
input your param1:1
input your param2:2
3
shell工具
cut
cut命令從文件的每一行剪切字節(jié),字符和字段并將這些字節(jié),字符和字段輸出
cut [選項(xiàng)參數(shù)] filename
- -f 列號(hào),提取第幾列
- -d 分隔符,按照指定分隔符分隔列
# DESC 切割cut.txt第一列
[linux@localhost datas]$ cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[linux@localhost datas]$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le# DESC 獲取第三行第一個(gè)單詞
[linux@localhost datas]$ cat cut.txt | grep guan | cut -d " " -f 1
guan
sed
sed是一種流編輯器,它一次處理一行內(nèi)容,處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,成為“模式空間”,接著sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕,接著處理下一行,這樣不斷重復(fù),知道文件末尾,文件內(nèi)容并沒(méi)有改變,除非你使用重定向存儲(chǔ)輸出
sed [選項(xiàng)參數(shù)] ‘command’ filename
- -e 直接在指令列模式上進(jìn)行sed的動(dòng)作編輯
命令功能描述
- a 新增
- d 刪除
- s 查找并替換
# DESC 在第二行后增加mei nv字符
[linux@localhost datas]$ sed -e "2a mei nv" sed.txt
dong zhen
guan zhen
mei nv
wo wo
lai lai
awk
awk 一個(gè)強(qiáng)大文件分析工具,把文件逐行的讀入,以空格為默認(rèn)分隔符將每行切片,切開(kāi)的部分再進(jìn)行分析處理
awk [選項(xiàng)參數(shù)] 'pattern1 {action1} pattern2{action2}..' filename
- -F 指定輸入文件分隔符
- -v 賦值一個(gè)用戶(hù)定義變量
sort
sort 命令是在Linux里非常有用,它將文件進(jìn)行排序,并將排序結(jié)果標(biāo)準(zhǔn)輸出
sourt [選項(xiàng)] (參數(shù))
參數(shù) | 描述 |
---|---|
-n | 依照數(shù)值大小排序 |
-t | 以相反的順序排序 |
-t | 設(shè)置排序時(shí)使用的分隔字符 |
-k | 指定需要排序的列 |