目錄
- Shell學習
- shell概述
- shell解釋器
- Shell腳本入門
- Shell中的變數
- 系統變數
- 自定義變數
- 特殊變數:$n
- 特殊變數:$#
- 特殊變數:$*、$@
- 特殊變數:$?
- 運算子
- 條件判斷
- 流程陳述句(重點)
- if判斷
- case陳述句
- for回圈
- while回圈
- read(讀取用戶輸入)
- 函式
- 系統函式
- 自定義函式
- shell工具(重點)
- 面試題
Shell學習
shell概述
shell是一個命令列解釋器,它接收應用程式/用戶命令,然后呼叫作業系統內核,
shell解釋器
- Linux提供的解釋器有
[shaofei@upuptop-pc ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
- bash和sh的關系
[shaofei@upuptop-pc bin]$ ll | grep bash
-rwxr-xr-x 1 root root 964600 Aug 8 2019 bash
lrwxrwxrwx 1 root root 4 Oct 28 2019 sh -> bash
- Centos默認的決議器是bash
[shaofei@upuptop-pc bin]$ echo $SHELL
/bin/bash
Shell腳本入門
-
腳本格式
腳本以 #!/bin/bash 開頭(指定決議器) -
第一個shell腳本
[shaofei@upuptop-pc sh]$ touch helloworld.sh
[shaofei@upuptop-pc sh]$ vim helloworld.sh
#!/bin/bash
echo "helloworld"
- 腳本的常用執行方式
(1) 采用bash或sh+腳本的相對路徑或絕對路徑(不用賦予腳本+x權限)
[shaofei@upuptop-pc sh]$ sh helloworld.sh
helloworld
[shaofei@upuptop-pc sh]$ bash helloworld.sh
helloworld
(2)采用輸入腳本的絕對路徑或相對路徑執行腳本(必須具有可執行權限+x)
[shaofei@upuptop-pc sh]$ chmod 777 helloworld.sh
[shaofei@upuptop-pc sh]$ ./helloworld.sh
helloworld
[shaofei@upuptop-pc sh]$ /home/shaofei/sh/helloworld.sh
helloworld
注意:第一種執行方法,本質是bash決議器幫你執行腳本,所以腳本本身不需要執行權限,第二種執行方法,本質是腳本需要自己執行,所以需要執行權限,
- 多命令處理
[shaofei@upuptop-pc sh]$ touch batch.sh
[shaofei@upuptop-pc sh]$ vim batch.sh
#!/bin/bash
echo 'hello'
cd /home/shaofei/sh
echo 'cccc' > a.txt
Shell中的變數
系統變數
- 常用的系統變數
\(PWD,\)HOME,\(USER,\)SHELL等
- 案例
[shaofei@upuptop-pc sh]$ echo $HOME
/home/shaofei
[shaofei@upuptop-pc sh]$ echo $PWD
/home/shaofei/sh
[shaofei@upuptop-pc sh]$ echo $USER
shaofei
顯示當前Shell中所有變數:set
[shaofei@upuptop-pc sh]$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
………………
自定義變數
-
基本語法
a. 定義變數: 變數名=變數值
b. 撤銷變數: unset 變數名
c. 宣告靜態變數: readonly 變數, 注意不能unset -
定義規則
a. 變數名可以使用字母、數字、下劃線組成,但是不能以數字開頭,環境變數建議全部大寫
b. 等號前后不能有空格
c. 在bash中,變數型別默認是字串型別,無法直接進行數值計算
d. 變數的值如果有空格必須要用"雙引號"引起來 -
案例
創建變數A并賦值為5
[shaofei@upuptop-pc sh]$ A=5
[shaofei@upuptop-pc sh]$ echo $A
5
給變數A重新賦值為9
[shaofei@upuptop-pc sh]$ A=9
[shaofei@upuptop-pc sh]$ echo $A
9
撤銷變數A
[shaofei@upuptop-pc sh]$ unset A
[shaofei@upuptop-pc sh]$ echo $A
創建靜態的變數B
[shaofei@upuptop-pc sh]$ readonly B=2
[shaofei@upuptop-pc sh]$ echo $B
2
靜態變數不能重新賦值
[shaofei@upuptop-pc sh]$ B=10
-bash: B: readonly variable
靜態變數不能unset
[shaofei@upuptop-pc sh]$ unset B
-bash: unset: B: cannot unset: readonly variable
在bash中,變數默認型別都是字串型別,無法直接進行數值運算
[shaofei@upuptop-pc sh]$ C=1+2
[shaofei@upuptop-pc sh]$ echo $C
1+2
變數的值如果有空格,需要使用雙引號或單引號括起來
[shaofei@upuptop-pc sh]$ D=I LOVE YOU
-bash: LOVE: command not found
[shaofei@upuptop-pc sh]$ D="I LOVE YOU"
[shaofei@upuptop-pc sh]$ echo $D
I LOVE YOU
可把變數提升為全域環境變數,可供其他Shell程式使用
[shaofei@upuptop-pc sh]$ vim helloworld.sh
在helloworld.sh檔案中增加echo $B
#!/bin/bash
echo "helloworld"
echo $B
沒有列印$B的值
[shaofei@upuptop-pc sh]$ sh helloworld.sh
helloworld
修改B變數為全域環境變數
[shaofei@upuptop-pc sh]$ export B
[shaofei@upuptop-pc sh]$ sh helloworld.sh
helloworld
2
特殊變數:$n
- 基本語法
$n 功能描述:n為數字,$0 代表該腳本名稱,$1-\(9代表第一到第九個引數,十以內的引數,十以上的引數需要用大括號包含,如\){10}
- 案例
輸出該腳本的檔案名稱、輸入引數1和輸入引數2的值
[shaofei@upuptop-pc sh]$ touch param.sh
[shaofei@upuptop-pc sh]$ vim param.sh
#!/bin/bash
echo $0 $1 $2
[shaofei@upuptop-pc sh]$ sh param.sh 1 2 3
param.sh 1 2
特殊變數:$#
- 基本語法
$# (獲取所有的引數個數,常用于回圈)
- 案例
[shaofei@upuptop-pc sh]$ vim param.sh
#!/bin/bash
echo $#
[shaofei@upuptop-pc sh]$ sh param.sh 1 2 3 4 5
5
特殊變數:$*、$@
- 基本說法
$* (功能描述:這個變數代表命令列中所有的引數,$*把所有的引數看做一個整體)
$@ (功能描述: 這個變數代表命令列中所有的引數,不過$@把每個引數區別對待)
- 案例
[shaofei@upuptop-pc sh]$ vim param.sh
#!/bin/bash
echo $@
echo $*
[shaofei@upuptop-pc sh]$ sh param.sh 1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
特殊變數:$?
- 基礎語法
$? (功能描述:最后一次執行的命令的回傳狀態,如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值為非0,則證明上一個命令執行不正確了)
- 示例:
[shaofei@upuptop-pc sh]$vim param.sh
#!/bin/bash
echo $?
[shaofei@upuptop-pc sh]$ ./helloworld.sh
helloworld
[shaofei@upuptop-pc sh]$ sh param.sh
0
運算子
- 基礎語法
(1) $((運算式))或$[運算式]
(2) expr +,-,*,/,% 加,減,乘,除,取余
注意:expr 運算子之間要有空格
- 實體
(1)計算3+2的值
[shaofei@upuptop-pc sh]$ expr 3 + 2
5
(2)計算3-2的值
[shaofei@upuptop-pc sh]$ expr 3 - 2
1
(3)計算(2+3)* 4的值
第一種方式
[shaofei@upuptop-pc sh]$ expr `expr 2 + 3 ` \* 4
20
第二種方式
[shaofei@upuptop-pc sh]$ echo $(((3+2)*4))
20
第三種方式
[shaofei@upuptop-pc sh]$ echo $[(2+3)*4]
20
條件判斷
-
基本語法
[ condition ](注意:condition前后有空格) -
常用的判斷條件
(1) 兩個整數之間比較
= 字串比較
-lt 小于(less than)
-le 小于等于(less equal)
-eq 等于(equal)
-gt 大于(greater)
-ge 大于等于(greater equal)
-ne 不等于(Not equal)
(2) 按照檔案權限進行比較
-r 有讀的權限(read)
-w 有寫的權限(write)
-x 有執行的權限(execute)
(3) 按照檔案型別進行判斷
-f 檔案存在并且是一個常規的檔案(file)
-e 檔案存在(existence)
-d 檔案存在且是一個目錄(directory)
案例:
- 23 是否大于等于 22
[shaofei@upuptop-pc ~]$ [ 22 -ge 23 ]
[shaofei@upuptop-pc ~]$ echo $?
1
[shaofei@upuptop-pc ~]$ [ 23 -ge 23 ]
[shaofei@upuptop-pc ~]$ echo $?
0
- HelloWorld.sh 是否有寫的權限
-rw-rw-r-- 1 shaofei shaofei 5 May 8 23:02 a.txt
-rw-rw-r-- 1 shaofei shaofei 65 May 8 23:01 batch.sh
-rwxrwxrwx 1 shaofei shaofei 38 May 8 23:36 helloworld.sh
-rw-rw-r-- 1 shaofei shaofei 31 Dec 8 01:01 k.sh.template
-rw-rw-r-- 1 shaofei shaofei 22 May 9 21:56 param.sh
-rw-rw-r-- 1 shaofei shaofei 59 Dec 8 01:01 start.sh.template
-rwxrwxrwx 1 shaofei shaofei 21 Nov 20 09:58 test1.sh
[shaofei@upuptop-pc sh]$ [ -r helloworld.sh ]
[shaofei@upuptop-pc sh]$ echo $?
0
[shaofei@upuptop-pc sh]$ [ -x batch.sh ]
[shaofei@upuptop-pc sh]$ echo $?
1
- /home/shaofei/aaa.txt 是否存在
[shaofei@upuptop-pc sh]$ [ -e /home/shaofei/aaa.txt ]
[shaofei@upuptop-pc sh]$ echo $?
1
- 多條件判斷(&& 表示前一條命令執行成功時,才執行后一條命令,|| 表示上一條命令執行失敗后,才執行下一條命令)
[shaofei@upuptop-pc sh]$ [ -e /home/shaofei/aaa.txt ] || echo false
false
[shaofei@upuptop-pc sh]$ [ -e /home/shaofei/aaa.txt ] && echo false
[shaofei@upuptop-pc sh]$
流程陳述句(重點)
if判斷
- 基本語法
if [ 條件判斷式 ]; then
程式代碼
fi
或者
if [ 條件判斷式 ]
then
程式代碼
fi
注意:
[ 條件運算式 ]中括號和條件判斷式之間必須有空格if后面要有空格- 第一種方式
then前面要有分號
- 案例
輸入一個數字,如果是1 則輸出 true 如果是2 則輸出 false 如果是其他數字則不做任何操作
[shaofei@upuptop-pc sh]$ vim if.sh
#!/bin/bash
if [ $1 -eq 1 ]; then
echo true
fi
if [ $1 -eq 2 ]; then
echo false
fi
[shaofei@upuptop-pc sh]$ sh if.sh 1
true
[shaofei@upuptop-pc sh]$ sh if.sh 2
false
[shaofei@upuptop-pc sh]$ sh if.sh 123
[shaofei@upuptop-pc sh]$
case陳述句
- 基礎語法
case $變數名 in
"value1")
如果變數等于value1,執行程式
;;
"value2")
如果變數等于value2,執行程式
;;
……省略其他分支……
esac
注意
- case行尾必須為單詞
in,每一個模式匹配必須以)結束, - 雙分號
;;表示命令序列結束,相當于java中的break - 最后可以使用
*)表示默認模式,相當于java中的break - 最后以
esac結束
- 案例
輸入一個數字,如果是1 則輸出 true 如果是2 則輸出 false 如果是其他數字輸出default
[shaofei@upuptop-pc sh]$ vim case.sh
#!/bin/bash
case $1 in
1)
echo true
;;
2)
echo false
;;
*)
echo default
;;
esac
[shaofei@upuptop-pc sh]$ sh case.sh 1
true
[shaofei@upuptop-pc sh]$ sh case.sh 2
false
[shaofei@upuptop-pc sh]$ sh case.sh 3
default
[shaofei@upuptop-pc sh]$
for回圈
- 基本語法
- 第一種方式
for (( 初始值;回圈控制條件;變數變化 ))
do
程式
done
- 第二種方式
for 變數 in 變數1,變數2,變數
do
程式
done
- 實體
計算1-100的和
[shaofei@upuptop-pc sh]$ vim for1.sh
#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
sum=$[$sum+$i] # or sum=$(( $sum+$i ))
done
echo $sum
[shaofei@upuptop-pc sh]$ sh for1.sh
列印所有的輸入引數 比較$* 和 $@
- 當
$*和$@都不被雙引號""包括的時候,沒有區別,$*和$@都表示傳遞給函式或腳本的所有引數,不被雙引號""包含時,都以$1 $2 …$n的形式輸出所有引數,
[shaofei@upuptop-pc sh]$ vim for2.sh
#!/bin/bash
echo ---------$*
for i in $*
do
echo $i
done
echo --------$#
for j in $@
do
echo $j
done
echo --------end
[shaofei@upuptop-pc sh]$ sh for2.sh 1 2 3 4
---------1 2 3 4
1
2
3
4
--------4
1
2
3
4
--------end
- 當它們被雙引號
""包含時,"$*"會將所有的引數作為一個整體,以"$1 $2 …$n"的形式輸出所有引數;"$@"會將各個引數分開,以"$1" "$2"…"$n"的形式輸出所有引數,
[shaofei@upuptop-pc sh]$ vim for3.sh
#!/bin/bash
echo ---------"$*"
for i in "$*"
do
echo $i
done
echo --------$#
for j in "$@"
do
echo $j
done
echo --------end
[shaofei@upuptop-pc sh]$ sh for3.sh 1 2 3 4
---------1 2 3 4
1 2 3 4
--------4
1
2
3
4
--------end
while回圈
- 基本語法
while [ 條件運算式 ]
do
程式
done
- 案例
計算1-100的和
[shaofei@upuptop-pc sh]$ vim while.sh
#!/bin/bash
sum=0
i=0
while [ $i -le 100 ]
do
sum=$(( $sum+$i ))
i=$[$i+1]
done
echo $sum
[shaofei@upuptop-pc sh]$ sh while.sh
5050
注意: while后面有空格.
read(讀取用戶輸入)
- 基本語法
read(選項)(引數)
選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等待的時間(秒),
引數
變數:指定讀取值的變數名
- 實體
[shaofei@upuptop-pc sh]$ vim read.sh
#!/bin/bash
read -p "input your name: " -t 3 NAME
echo "Your Name is $NAME !"
[shaofei@upuptop-pc sh]$ sh read.sh
input your name: shaofeer
Your Name is shaofeer !
函式
系統函式
- basename
- basename基本語法
basename [string/pathname][suffix]
(功能描述:basename命令會刪掉所有的前綴包括最后一個(‘/’)字符,然后將字串顯示出來,
選項:
suffix為后綴,如果suffix被指定了,basename會將pathname或string中的suffix去掉,
- 案例實操
[shaofei@upuptop-pc sh]$ basename /home/shaofei/123.txt
123.txt
[shaofei@upuptop-pc sh]$ basename /home/shaofei/123.txt .txt
123
- dirname
- dirname基本語法
dirname 檔案絕對路徑
(功能描述:從給定的包含絕對路徑的檔案名中去除檔案名(非目錄的部分),然后回傳剩下的路徑(目錄的部分))
- 案例實操
獲取a.txt檔案的路徑
[shaofei@upuptop-pc sh]$ dirname /home/shaofei/sh/a.txt
/home/shaofei/sh
自定義函式
- 基本語法
[ function ] funname[()]
{
Action;
[return int;]
}
funname
- 經驗技巧
-(1)必須在呼叫函式地方之前,先宣告函式,shell腳本是逐行運行,不會像其它語言一樣先編譯,
-(2)函式回傳值,只能通過$?系統變數獲得,可以顯示加:return回傳,如果不加,將以最后一條命令運行結果,作為回傳值,return后跟數值n(0-255)
3.案例實操
(1)計算兩個輸入引數的和
[shaofei@upuptop-pc sh]$ vim fun.sh
#!/bin/bash
function sum(){
sum=$[$1+$2]
return $sum
}
sum 1 2
echo $?
[shaofei@upuptop-pc sh]$ sh fun.sh
3
shell工具(重點)
待更新……
面試題
待更新……
個人學習總結
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/84865.html
標籤:Linux
上一篇:行程管理類命令
下一篇:Linux安裝MySQL
