上兩篇文章詳細介紹了Linux的常用命令以及Shell的基本認識。
Linux常用命令:https://blog.csdn.net/weixin_44895651/article/details/105289038
Shell基礎:https://blog.csdn.net/weixin_44895651/article/details/105931755
Shell變量
Shell允許用戶建立變量存儲數據,但是不支持數據類型(整形、字符、浮點型),將任何變量的值都解釋爲一個字符串。
Shell變量不需要向C語言中那樣需要提前定義,Shell變量可以直接賦值。
例如:
count=1#定義一個count變量,並且賦值爲1
echo $count#打印變量的值
DATE=date#定義一個DATE變量,並且把日期賦值給該變量(屬於命令置換)
echo $DATE#打印日期
打印Shell變量必須加上$符號,如果不加該符號會默認打印該字符串。同時等號兩邊不加空格。
Bourne Shell的四種變量:
- 用戶自定義變量
在Shell編程中通常使用全大寫變量,方便識別
變量的調用:在變量前加$符號
Linux Shell/bash從右向左賦值
$Y=y
$ X=$Y
$ echo $X
y
使用unset命令刪除變量的賦值
$ Z=hello
$ echo ¥Z
hello
$ unset Z#刪除變量
- 位置變量(命令行參數)
參數 | 意義 |
---|---|
$0 | 與鍵入命令行一樣,包含腳本文件名 |
$1,$2,…$9 | 分別包含第一個到第九個命令行參數 |
$# | 包含命令行參數的個數 |
$@ | 包含命令行參數:“$1,$2,…$9 ” |
$? | 包含前一個命令行的退出狀態 |
$* | 包含所有命令行參數:“ $1,$2,…$9” |
$$ | 包含正在執行進程的ID號 |
當參數數量超過兩位數時,需要加上大括號
- 環境變量
在使用系統時,已經在腳本中提前寫好的一些環境變量。
常用的Shell環境變量:
變量名 | 作用 |
---|---|
HOME | /etc/passwd文件中列出用戶主目錄 |
IFS | 默認爲空格,tab及換行符 |
PATH | Shell搜索路徑 |
PS1,PS2 | 默認提示符($)及換行提示符(>) |
TERM | 終端類型,常用的有vt100,ansi,vt200,xterm等 |
Shell程序和語句
Shell程序由零或者多條Shell語句構成。Shell語句包括三類:
說明性語句:以#開始到改行結束,不被執行(除腳本第一行告訴系統用那種類型的Shell來執行)
功能性語句:任意shell命令、用戶程序或者其它shell程序。
① read從標準輸入讀入一行,並且賦值給後面的變量,語法爲:
read var#把讀入的數據全部賦給var
read var1 var2 var3#把讀入的第一個單詞賦值給var1,第二個賦值給var2...
注意:如果執行read語句時標準輸入無數據,則程序在此處停留,直到數據到來或者被終止執行。
#輸入一個變量:
#!/bin/bash
echo 'input a number'
read NUM
echo $NUM
#輸入多個變量:
#!/bin/bash
echo 'input year month day'
read Y M D
echo "today is $Y-$M-$D"
注意:如果變量輸入多了,多餘的值全部賦值給最後一個變量。
②算數運算命令expr主要用於簡單的整數運算,包括加(+)、減(-)、乘(*)、除(/)和求模(%)等。
#!/bin/bash
A='expr 3 + 5 \* 4'#注意運算符兩邊必須有空格
echo $A
注意:變量賦值沒有空格,算數運算符兩側有空格
③test測試語句:
測試對象:字符串、整數、文件屬性
test '$answer' = 'yes'#測試變量answer是否爲字符串類型
test $num -eq 18#測試變量num是否爲整數18
test -d tmp#測試tmp是否爲一個目錄名
字符串測試:
命令 | 測試內容 |
---|---|
s1 = s2 |
測試兩個字符串的內容是否完全一樣 |
s1 != s2 |
測試兩個字符串內容是否有差異 |
-z s1 |
測試字符串的長度是否爲0 |
-n s1 |
測試s1字符串長度是否不爲0 |
整數測試:
命令 | 測試內容 |
---|---|
a -eq b |
測試a和b是否相等 |
a -nq b |
測試a和b是否不相等 |
a -gt b |
測試a是否大於b |
a -ge b |
測試a 是否大於等於b |
a -lt b |
測試a是否小於b |
a -le b |
測試a是否小於等於b |
文件測試:
命令 | 測試內容 |
---|---|
-d name |
測試name文件是否爲一個目錄 |
-e name |
測試一個文件是否存在 |
-f name |
測試name文件是否爲普通文件 |
-L name |
測試name文件是否爲符號鏈接 |
-r name |
測試name文件是否存在且可讀 |
-w name |
測試name 文件是否是否存在且可寫 |
-x name |
測試name文件是否存在且尚可執行 |
-s name |
測試name文件是否存在且長度不爲0 |
f1 -nt f2 |
測試文件f1是否比f2文件更新 |
f1 -ot f2 |
測試文件f1是否比f2更舊 |
結構性語句:條件測試語句、多路分支語句、循環語句、循環控制語句等。
① 條件語句:
語法結構 1:
if 表達式
then 命令表
fi
說明:
- 如果表達式爲真,則執行命令表中的命令;負責退出if語句,即執行fi後面的語句
- if和fi是條件語句的句號括號,必須成對使用
- 命令表中的命令可以是一條也可以是若干條
語法結構 2:
if 表達式
then 命令表1
else 命令表1
fi
- 如果表達式爲真,則執行命令表1中的命令,再退出if語句;負責執行命令表2中的語句,再退出if語句
注意:在Shell中表達式爲真——爲0即爲真。可以是一條,也可以是多條表達式來判斷。同時也可以像C語言一樣進行嵌套
if [ $# -ne 1 ] #如果沒有提供文件名的話則給用戶提示
then
echo 'usage:$0 filename'
exit
fi
if [ -e $1 ] #測試文件是否存在
then
echo '$1 not exit'
exit
fi
if [ -L $1 ] #測試文件是否爲一個鏈接文件
then
echo 'l'
elif [ -d $1 ]
then
echo 'd'
elif [ -f $1 ]
then
echo '-'
elif [ -b $1 ]
then
echo 'b'
else
echo 'd'
fi
② 多路分支語句 case…esac
多路分支語句case用於多重條件測試,語法結構清晰自然。其語法爲:
case 字符串變量 in
模式1)
命令表1
;;
模式2|模式3)
命令表2
;;
......
模式n)
命令表n
;;
esac
注意:case語句只能檢測字符串變量;各模式中可用文件名元字符,以右括號結束;命令行以單獨的雙分號行結束,退出case語句;模式n常寫爲字符*表示所有其它模式;最後一行雙分號可以省略。
echo -n 'please choose (yes|no)?' #-n是不換行
read R
case $R in
yes | y | Y | YES )
echo 'yes'
;;
no | n | NO | N )
echo 'no'
;;
*)
echo 'wrong'
esac
③ 循環語句
當循環次數已知或確定時,使用for循環語句來多次執行一條或者一組命令。循環體由語句do和done來限定。格式如下:
for 變量名 in 單詞表
do
命令表
done
變量依次取單詞表中的各個單詞,每取一次單詞,就執行一次循環體中的命令。循環次數由單詞表中的單詞個數確定。命令表中的命令可以是一條,也可以是由分號或者換行符分開的多條。
#方法一:
SUM=0
for I in $(seq 0 2 100) #實現的功能是for(I=0;I<=100;I=I+2)
do
echo $I
SUM=$SUM+$I
done
echo $[SUM]
#方法二:
SUM=0
for ((I = 1; I <= 100 ; I=I+2))
do
echo $I
SUM=$SUM+$I
done
echo $[SUM]
當不知道循環次數時,我們選擇使用while循環。循環語法結構如下:
while 命令或表達式
do
命令行
done
while循環首先測試其後的命令或表達式的值,如果爲真,就執行一次循環體中的命令,然後測試該命令或表達式的值,執行循環體,直到該命令或表達式爲假時退出循環。
while語句的退出狀態爲命令表中被執行的最後一條命令的退出狀態
SUM=0
I=100
while [ $I -ge 0 ] #判斷變量I是否大於等於0
do
SUM=$SUM+$I
I=$(($I-2))
done
echo $[SUM]
這幾段代碼中有關於變量運算的知識,具體的請戳鏈接:Linux Shell之數字加減文章中有詳細介紹。
④循環控制語句break和continue
break n #跳出n層
continue語句則馬上轉到最近一層循環語句的下一輪循環上。
continue n#轉到最近n層循環語句的下一輪循環上
I=1
while [ $I -lt 5 ]
do
J=1
while [ $J -lt 5 ]
do
J=$(($J+1))
if [ $J -gt 3 ]
then
break 2 #跳出兩層循環
fi
echo "$I-$J"
done
I =$(($I+1))
done
輸出結果:
不積小流無以成江河,不積跬步無以至千里。而我想要成爲萬里羊,就必須堅持學習來獲取更多知識,用知識來改變命運,用博客見證成長,用行動證明我在努力。
如果我的博客對你有幫助、如果你喜歡我的博客內容,請“點贊” “評論” “收藏”
三連哦!聽說點讚的人運氣不會太差
,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看。