shell編程(shell的概念,變數,輸入輸出,運算子,運算式,條件測驗,流程控制,陣列,函式
應用程式----shell命令解釋器—內核—硬體
1.shell的概念:
shell是一個解釋性腳本語言,腳本就是不需要編譯的語言,可以批量次處理命令,
定義:
解釋性腳本語言,批量處理命令使用,類似windows下的.dat檔案,屬于Linux內核的一個外層保護工具,負責完成用戶和內核的互動,
規則:
建立shell檔案:
vim gedit touch …
shell檔案的后綴名是:.sh
shell 是一門語言,有自己的撰寫規則
運行環境設定:
第一行
#!/bin/bash //宣告shell型別 bash shell
或者
#!/bin/sh
腳本陳述句撰寫:
shell命令(if-else)+系統命令(ls cd cp …)
注釋行以#開頭
設定可執行性:
你建立的shell腳本是默認沒有執行權限的,需要設定
chmod +x xx.sh
決議方式 xx.sh
執行腳本檔案:
./xx.sh
. xx.sh
前提需要有執行權限
2.關于變數
shell 里的變數沒有型別之分的,直接定義,直接使用,
使用的時候要加:$
變數定義:
直接定義 str=hello //等號兩端不能有空格
雙引號定義 str="hello"//保留特殊字符的含義
單引號定義 str = 'hello' //去除特殊字符的含義
vim 1.sh
#!/bin/bash
str1="hello"
str=hello
echo str
echo "$str1"
echo '$str1'
chmod 777 1.sh
./1.sh
在這里插入代碼片
運行結果:

說明:$:參考,放在雙引號里面還是參考的作用,放在單引號里面是去除的意思,
小飄號定義str=`date` 或則 str=$(date)
:用來參考系統指令
#!/bin/bash
str1="hello"
str=hello
str2=$(date)
echo "$str2"
echo str
echo "$str1"
echo '$str1'
ls
pwd
運行結果:

**變數的參考**
類似于命令的重定向(命令運行結果重定向到變數內)
命令重定向
>輸出重定向(覆寫原內容)
echo hello >1.txt
>>輸出重定向(不覆寫原內容,追加)
echo world >>1.txt
變數的分類
自定義變數
自己定義,自己使用
特殊變數
$0 命令本身
$1 $2 ....$n //取命令列引數
$@//取所有的引數
不包括第0個
$? //判斷上一條命令是否執行成功,成功列印0 失敗列印非0
$#//傳遞引數的個數
$$//顯示當前的行程號
#!/bin/bash
echo "$0" #顯示命令本身
echo "$1" #取命令列引數
echo "$2" #取命令列引數
echo "$@" #取所有引數,不包括第0個
echo "$?" #判斷上一條命令是否執行成功,成功列印0
echo "$#" #傳遞引數的個數
echo "$$" #顯示當前的行程號
顯示結果:

環境變數
定義
由系統維護,用于設定系統的shell作業環境,極少數用戶可以修改
示例
執行命令的時候,就會去指定的目錄(bin、sbin、usr/bin)去尋找是否有這個命令
運行程式的時候去指定的路徑(lib、usr/lib)加載庫檔案
操作
env //顯示所有環境變數
HOSTNAME:當前主機名
SHELL:shell型別
QTDIR:qt安裝路徑
USER:當前用戶
PATH:指定當前命令尋找路徑
==========================================================
設定環境變數
export PATH=$PATH:/root //將root路徑添加PATH環境變數里面(重啟后失效)(設定shell腳本路徑)
將這句話加入到開機自啟動的檔案里面即可永久生效
/root/.bashrc
/etc/profile(推薦)
/etc/inittab
/etc/rcs
修改
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH(設定動態庫路徑,這樣就不用將動態庫復制到/usr/lib里了 LD_LIBRARY_PATH: 動態庫的查找路徑)
注意
變數都是字串,沒有型別之分,不用宣告
3.輸入輸出
輸入
read num//輸入num
readonly num=5 //定義只讀變數num
輸出
echo命令
printf
參考代碼:
#!/bin/bash
echo "qing shu ru shu:\n"
read num
echo $num
readonly n=100
echo $n
顯示結果:

3.運算子&運算式
運算子
算術運算子、邏輯運算子、賦值運算子等
加減乘除 與或非
計算運算式的四種方法
var=$((1+2))
var=$[1+2]
let var=1+2
var=$(expr 1 + 2)
注意:運算子前后要加空格
4.條件測驗
語法
test 條件運算式:
test 運算式1 = 運算式2
等號兩邊須有空格
test string1 = string2
[條件運算式]
[ string1 = string2 ]
注意
條件運算式值為真回傳0,為假回傳非0
echo $?
非0為假,0為真
條件運算式兩邊都要有空格
判斷整數
-gt:大于
test 1 -gt 2 或者簡寫 1 -gt 2
echo $?
1為假,0為真
-ge:大于等于
-eq:等于
-le:小于等于
-lt:小于
-ne:不等于
判斷運算式
-a:兩個條件都有滿足
----------and
-o:滿足一個條件即可
----------or
字串比較
[[ -z $str ]] //長度為0 回傳0
[[ $str1 == $str2 ]]//判斷是否相等
[[ $str1 != $str2 ]]
檔案條件測驗
-f -L -d -e
-w -r -x

5.流程控制
if then else
if [條件1]
then
命令1
elif [條件2]
then
命令2
…
else
命令n
fi
#!/bin/bash
echo "請輸入1-7的整數"
read num
if [ $num == 1 ]
then
echo "今天星期一"
elif [ $num == 2 ]
then
echo "今天星期二"
else
echo "輸入錯誤"
fi
case
case $變數 in
“1”)
命令1
;;
“2”)
命令2
;;
esac

#!/bin/bash
echo "請輸入1-7的整數"
read num
case $num in
"1")
echo "今天星期一"
;;
"2")
echo "今天星期二"
;;
*)
echo "輸入錯誤"
;;
esac
for
形式一
for x in 串列
do
命令
done

#!/bin/bash
for x in 1 2 3 4 5
do
echo "hello world"
done
seq 命令:
`seq 1 10` #執行10次
形式二
for((i=0;i<5;i++))
do
陳述句
done
#!/bin/bash
for x in `seq 1 10` #小撇號作用:參考系統指令
do
echo "hello world"
done
另一種寫法:
#!/bin/bash
for((i=0;i<5;i++))
do
echo "hello world"
done
while
while [回圈條件]
do
命令
done

#!/bin/bash
echo "請輸入整數"
read num
while [ $num -lt 10 ]
do
echo "hello"
num=$(($num+1))
done
補充:
退出死回圈的方法:
方法一:
ctrl+c
方法2:
ps -ef //查看當前行程
找到行程號
kill -9 30312 //殺死行程
until
until 條件
do
命令
done

#!/bin/bash
echo "請輸入整數" //大于10
read num
until [$num -lt 10]
do
echo "hello"
num=$(($num-1))
done
break continue

#!/bin/bash
for ((i=0;i<5;i++))
do
echo "hello world" //列印4次
if (($i==3))
then
break //continue列印5次
fi
done
6.陣列
定義
定義 1: a=(1 2 3 4 5)下標從 0 開始 各個資料之間用空格隔開
定義 2: a[0]=1;a[1]=2;a[2]=3
定義 3: a=([1]=1 [2]=2)
參考
取值: ${a[0]}
${a[@]} //取陣列中所有的值
${#a[@]} //取陣列的長度
${a[@]:2} //截取下標為2及以后的所有元素
${a[@]:2:2} //截取下標為2及以后的2個元素
#!/bin/bash
a=(1 2 3 4 5 6)
echo ${a[0]} //列印1
echo ${a[@]} //1 2 3 4 5 6
echo ${#a[@]} //6
echo ${a[@]:2} // 3 4 5 6
echo ${a[@]:2:2} // 3 4
7.函式
呼叫的時候直接寫函式名即可
無回傳值 無引數 僅僅用來封裝代碼
function_name()
{}
#!/bin/bash
fun()
{
echo "hello"
}
fun
8.shell編程的應用:
8.1,查找當前路徑下的所有.c檔案:
#!/bin/bash
#簡化版的查找.c檔案的shell腳本
#尋找.c檔案的函式(function )
findcfile()
{
#找到以.c結尾的檔案,檔案名串列存放在變數cfilelist里邊
cfilelist=$(ls | grep '.c$')
#通過for回圈顯示檔案路徑以及檔案名
for cfilename in $cfilelist
do
echo $(pwd)/$cfilename
done
}
#呼叫函式實作查找
echo "當前路徑下的.c檔案有:"
findcfile

即可查找出當前路徑下所有的.c檔案,
8.2,查找當前路徑及檔案夾下所有的.c檔案,
#!/bin/bash
#完整版的查找.c檔案的shell腳本,可以進入檔案夾
#判斷通過引數傳遞的檔案夾是否存在,是否為空
if [[ -z $1 ]] || [[ ! -e $1 ]]
then
#如果沒有傳遞檔案夾,就在當前目錄下尋找
echo "The directory is empty or not exist!"
echo "It will use the current directory."
newdir=$(pwd) //參考當前路徑給變數
echo "當前所在路徑是:"
echo $newdir
echo "這個路徑下.c檔案有:"
else
#如果傳遞的有檔案夾,進入傳遞的檔案夾,開始尋找
cd $1
newdir=$(pwd)
echo "當前所在路徑是:"
echo $newdir
echo "這個路徑下.c檔案有:"
fi
#遞回尋找.c檔案的函式
findcfile()
{
#找到以.c結尾的檔案,檔案名串列放存在變數cfilelist里邊
cfilelist=$(ls | grep '.c$')
#通過for回圈顯示檔案路徑以及檔案名
for cfilename in $cfilelist
do
echo $(pwd)/$cfilename
done
#遍歷該目錄,當判斷其為目錄的時候,進入目錄,呼叫該函式,實作遞回
dirlist=$(ls)
for dirname in $dirlist
do
if [ -d $dirname ]
then
cd $dirname
findcfile
cd .. //回傳上層目錄
fi
done
}
#呼叫遞回函式實作查找
findcfile

即可列印出所有的.c檔案,
參考結構流程圖:
shell編程
注:需要使用xmind軟體進行查看
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/163982.html
標籤:python
