Shell學習記錄上

1、Shell概述

在這裏插入圖片描述

2、Shell解析器

(1)Linux提供的Shell解析器有:

/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

(2)bash和sh的關係

-rwxr-xr-x. 1 root root 941880 5月  11 2016 bash
lrwxrwxrwx. 1 root root      4 5月  27 2017 sh -> bash

(3)Centos默認的解析器是bash

/bin/bash

3、 Shell腳本入門

1.腳本格式
腳本以#!/bin/bash開頭(指定解析器)

2.第一個Shell腳本:helloworld
(1)需求:創建一個Shell腳本,輸出helloworld

#!/bin/bash
echo "helloworld"

(3)腳本的常用執行方式
第一種:採用bash或sh+腳本的相對路徑或絕對路徑(不用賦予腳本+x權限)

sh+腳本的相對路徑
sh+腳本的絕對路徑
bash+腳本的相對路徑
bash+腳本的絕對路徑

第二種:採用輸入腳本的絕對路徑或相對路徑執行腳本
(必須具有可執行權限+x)
(a)首先要賦予helloworld.sh 腳本的+x權限

chmod 777 helloworld.sh

(b)執行腳本
相對路徑:./helloworld.sh
絕對路徑:xx/xx//helloworld.sh
注意:
第一種執行方法,本質是bash解析器幫你執行腳本,所以腳本本身不需要執行權限。
第二種執行方法,本質是腳本需要自己執行,所以需要執行權限。

3.第二個Shell腳本:多命令處理
(1)需求:
在/home/chenixiangyang/目錄下創建一個chenxiangyang.txt,在chenxiangyang.txt文件中增加“I love cls”。

#!/bin/bash
cd /home/chenixiangyang
touch chenixiangyang.txt
echo "I love cls" >>chenixiangyang.txt

4、Shell中的變量

1、常用系統變量

$HOME$PWD$SHELL$USER

2.案例實操
(1)查看系統變量的值

echo $HOME
/home/atguigu

(2)顯示當前Shell中所有變量:set

set
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()

4.2 自定義變量

1.基本語法
(1)定義變量:變量=值
(2)撤銷變量:unset 變量
(3)聲明靜態變量:readonly變量,注意:不能unset

2.變量定義規則
(1)變量名稱可以由字母、數字和下劃線組成,但是不能以數字開頭,環境變量名建議大寫。
(2)等號兩側不能有空格
(3)在bash中,變量默認類型都是字符串類型,無法直接進行數值運算。
(4)變量的值如果有空格,需要使用雙引號或單引號括起來。

3.案例實操
(1)定義變量A

A=5
echo $A
5

(2)給變量A重新賦值

A=8
echo $A
8

(3)撤銷變量A

unset A
echo $A

(4)聲明靜態的變量B=2,不能unset

readonly B=2
echo $B
2
B=9
-bash: B: readonly variable

(5)在bash中,變量默認類型都是字符串類型,無法直接進行數值運算

C=1+2
echo $C
1+2

(6)變量的值如果有空格,需要使用雙引號或單引號括起來

D=I love banzhang
-bash: world: command not found
D="I love banzhang"
echo $A
I love banzhang

(7)可把變量提升爲全局環境變量,可供其他Shell程序使用
export 變量名

在helloworld.sh文件中增加echo $B
#!/bin/bash
echo "helloworld"
echo $B
./helloworld.sh 
Helloworld

發現並沒有打印輸出變量B的值。

export B
./helloworld.sh 
helloworld
2

4.3 特殊變量:$n
1.基本語法
$n(功能描述:n爲數字,$0代表該腳本名稱,$1-$9代表第一到第九個參數,十以上的參數,十以上的參數需要用大括號包含,如${10})

2.案例實操
(1)輸出該腳本文件名稱、輸入參數1和輸入參數2 的值

#!/bin/bash
echo "$0  $1   $2"

 chmod 777 parameter.sh
 
./parameter.sh cls  xz
./parameter.sh  cls   xz

4.4 特殊變量:$#
1.基本語法
$# (功能描述:獲取所有輸入參數個數,常用於循環)。

2.案例實操
(1)獲取輸入參數的個數

#!/bin/bash
echo "$0  $1   $2"
echo $#

chmod 777 parameter.sh

./parameter.sh cls  xz

parameter.sh cls xz 
2

4.5 特殊變量:$*、$@

1.基本語法
$*(功能描述:這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體)
$a(功能描述:這個變量也代表命令行中所有的參數,不過$a把每個參數區分對待)

2.案例實操
(1)打印輸入的所有參數

#!/bin/bash
echo "$0  $1   $2"
echo $#
echo $*
echo $@

bash parameter.sh 1 2 3

parameter.sh  1   2
3
1 2 3
1 2 3

4.6 特殊變量:
1.基本語法
$?(功能描述:最後一次執行的命令的返回狀態。如果這個變量的值爲0,證明上一個命令正確執行;如果這個變量的值爲非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)

2.案例實操
(1)判斷helloworld.sh腳本是否正確執行

./helloworld.sh 
hello world

echo $?
0

5、 運算符
1.基本語法
(1)“$((運算式))”或“$[運算式]”
(2)expr + , - , *, /, % 加,減,乘,除,取餘
注意:expr運算符間要有空格

2.案例實操:
(1)計算3+2的值

expr 2 + 3
5

(2)計算3-2的值

expr 3 - 2 
1

(3)計算(2+3)X4的值

(a)expr一步完成計算

expr `expr 2 + 3` \* 4
20

(b)採用$[運算式]方式

S=$[(2+3)*4]
echo $S

6、條件判斷

1.基本語法
[ condition ](注意condition前後要有空格)
注意:條件非空即爲true,[ abc]返回true,[] 返回false。

2.常用判斷條件
(1)兩個整數之間比較

= 字符串比較
-lt 小於(less than)			
-le 小於等於(less equal)
-eq 等於(equal)				
-gt 大於(greater than)
-ge 大於等於(greater equal)	
-ne 不等於(Not equal)

(2)按照文件權限進行判斷

-r 有讀的權限(read)			
-w 有寫的權限(write)
-x 有執行的權限(execute)

(3)按照文件類型進行判斷

-f 文件存在並且是一個常規的文件(file)
-e 文件存在(existence)		
-d 文件存在並是一個目錄(directory)

3.案例實操
(1)23是否大於等於22

[ 23 -ge 22 ]
echo $?
0

(2)helloworld.sh是否具有寫權限

[ -w helloworld.sh ]
echo $?
0

(3)/home/atguigu/cls.txt目錄中的文件是否存在

[ -e /home/atguigu/cls.txt ]
echo $?
1

(4)多條件判斷(&& 表示前一條命令執行成功時,才執行後一條命令,|| 表示上一條命令執行失敗後,才執行下一條命令)

&& echo OK || echo notok
OK
&& [ ] || echo notok
notok

7、流程控制(重點)

7.1 if 判斷
1.基本語法

if [ 條件判斷式 ];then 
  程序 
fi 
或者 
if [ 條件判斷式 ] 
  then 
    程序 
elif [ 條件判斷式 ]
	then
		程序
else
	程序
fi

注意:
(1)[ 條件判斷式 ],中括號和條件判斷式之間必須有空格
(2)if後要有空格

2.案例實操
(1)輸入一個數字,如果是1,則輸出chenxiangyang,如果是2,則輸出陳向陽,如果是其它,什麼也不輸出。

#!/bin/bash

if [ $1 -eq "1" ]
then
        echo "chenxiangyang"
elif [ $1 -eq "2" ]
then
        echo "陳向陽"
fi

chmod 777 if.sh

./if.sh 1

chenxiangyang

7.2 case 語句
1.基本語法

case $變量名 in 
  "值1") 
    如果變量的值等於值1,則執行程序1 
    ;; 
  "值2") 
    如果變量的值等於值2,則執行程序2 
    ;; 
  …省略其他分支… 
  *) 
    如果變量的值都不是以上的值,則執行此程序 
    ;; 
esac

注意事項:
(1) case行尾必須爲單詞“in”,每一個模式匹配必須以右括號“)”結束。
(2) 雙分號“;;”表示命令序列結束,相當於java中的break。
(3) 最後的“*)”表示默認模式,相當於java中的default。

2.案例實操
(1)輸入一個數字,如果是1,則輸出chenxiangyang,如果是2,則輸出cxy,如果是其它,輸出ren。


!/bin/bash

case $1 in
"1")
        echo "chenxiangyang"
;;

"2")
        echo "cxy"
;;
*)
        echo "ren"
;;
esac

chmod 777 case.sh

./case.sh 1

1

7.3 for 循環
1.基本語法1

	for (( 初始值;循環控制條件;變量變化 )) 
  do 
    程序 
  done

2.案例實操
(1)從1加到100

#!/bin/bash

s=0
for((i=0;i<=100;i++))
do
        s=$[$s+$i]
done
echo $s

chmod 777 for1.sh 

./for1.sh

“5050”

3.基本語法2

for 變量 in 值1 值2 值3… 
  do 
    程序 
  done

4.案例實操
(1)打印所有輸入參數


#!/bin/bash
#打印數字

for i in $*
    do
      echo "ban zhang love $i "
    done

chmod 777 for2.sh 

bash for2.sh cls xz bd

ban zhang love cls
ban zhang love xz
ban zhang love bd

(2)比較$*和$@區別
(a)$*和$@都表示傳遞給函數或腳本的所有參數,不被雙引號“”包含時,都以$1 $2 …$n的形式輸出所有參數。


#!/bin/bash 

for i in $*
do
      echo "ban zhang love $i "
done

for j in $@
do      
        echo "ban zhang love $j"
done

bash for.sh cls xz bd

ban zhang love cls 
ban zhang love xz 
ban zhang love bd 
ban zhang love cls
ban zhang love xz
ban zhang love bd

(b)當它們被雙引號“”包含時,“$*”會將所有的參數作爲一個整體,以“$1 22 …n”的形式輸出所有參數;“$@”會將各個參數分開,以“$1” “22”…”n”的形式輸出所有參數。

#!/bin/bash 

for i in "$*" 
#$*中的所有參數看成是一個整體,所以這個for循環只會循環一次 
        do 
                echo "ban zhang love $i"
        done 

for j in "$@" 
#$@中的每個參數都看成是獨立的,所以“$@”中有幾個參數,就會循環幾次 
        do 
                echo "ban zhang love $j" 
done

chmod 777 for.sh

bash for.sh cls xz bd

ban zhang love cls xz bd
ban zhang love cls
ban zhang love xz
ban zhang love bd

7.4 while 循環
1.基本語法

while [ 條件判斷式 ] 
  do 
    程序
  done

2.案例實操
(1)從1加到100


#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
        s=$[$s+$i]
        i=$[$i+1]
done

echo $s

chmod 777 while.sh 

./while.sh 

5050

第8章 read讀取控制檯輸入
1.基本語法
read(選項)(參數)
選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等待的時間(秒)。
參數
變量:指定讀取值的變量名
2.案例實操
(1)提示7秒內,讀取控制檯輸入的名稱


#!/bin/bash

read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME

./read.sh 

Enter your name in 7 seconds xiaoze
xiaoze

9、函數

9.1 系統函數
1.basename基本語法
basename [string / pathname] [suffix] (功能描述:basename命令會刪掉所有的前綴包括最後一個(‘/’)字符,然後將字符串顯示出來。
選項:
suffix爲後綴,如果suffix被指定了,basename會將pathname或string中的suffix去掉。

2.案例實操
(1)截取該/home/atguigu/banzhang.txt路徑的文件名稱

basename /home/atguigu/banzhang.txt 

banzhang.txt

basename /home/atguigu/banzhang.txt .txt
banzhang

3.dirname基本語法
dirname 文件絕對路徑
(功能描述:從給定的包含絕對路徑的文件名中去除文件名(非目錄的部分),然後返回剩下的路徑(目錄的部分))

4.案例實操
(1)獲取banzhang.txt文件的路徑

dirname /home/atguigu/banzhang.txt 
/home/atguigu

9.2 自定義函數
1.基本語法

[ function ] funname[()]
{
	Action;
	[return int;]
}
funname

2.經驗技巧
(1)必須在調用函數地方之前,先聲明函數,shell腳本是逐行運行。不會像其它語言一樣先編譯。
(2)函數返回值,只能通過$?系統變量獲得,可以顯示加:return返回,如果不加,將以最後一條命令運行結果,作爲返回值。return後跟數值n(0-255)

3.案例實操
(1)計算兩個輸入參數的和

#!/bin/bash
function sum()
{
    s=0
    s=$[ $1 + $2 ]
    echo "$s"
}

read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;

chmod 777 fun.sh

./fun.sh

Please input the number1: 2
Please input the number2: 5
7
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章