tft每日頭條

 > 科技

 > linux中shell編程實例

linux中shell編程實例

科技 更新时间:2025-04-24 19:09:47
shell 編程一、變量1. shell腳本基礎知識

編譯型語言:如 c語言 解釋型語言:shell 腳本

shell腳本的本質:shell命令的有序集合

2.shell 編程的基本過程

基本過程分為三步:

  1. 建立shell文件:包含任意多行操作系統命令或shell命令的文本文件。——xx.sh
  2. 賦予shell文件執行權限,==用chmod命令修改權限==。
  3. 執行shell文件,直接在命令行上調用shell程序

示例:

  1. 建立shell文件 prog1.sh

data

  1. 賦予shell文件執行權限 (初始文本文件無執行權限)

chmod 740 prog1.sh #或者 chmod u x prog1.sh

  1. 執行shell文件

prog1.sh #結果為 prog1.sh :not found

原因是:shell在标準搜索路徑中找不到prog1.sh 4.正确的執行shell文件

./prog1.sh #結果為 2009年 12月 16日 星期二 14:52:57 CST

3. shell變量

shell允許用戶建立變量存儲數據,但不支持數據類型(整型,字符,浮點型),将任何賦給變量的值都解釋為一串字符 Variable = value

  • count = 1
  • echo $ count
  • DATE = data
  • echo $ DATE

linux中shell編程實例(Linux基礎-shell編程)1

在這裡插入圖片描述

==注意幾點:==

變量沒有類型

=号兩邊不能加空格

變量必須是大寫

賦值的時候要用``框起來

Bourne shell有如下四種變量:

  • 用戶自定義變量: 在shell編程中通常使用全大寫變量:COUNT=1變量的調用,在變量前加$:echo $HOMELinux shell / bash 從右向左賦值:Y=y、X=$Y、echo $X 、y使用unset命令删除變量的賦值:Z=hello、echo $Z、hello、unset Z、echo$Z
  • 位置變量及命令行參數: $0 與鍵入的命令行一樣,包含腳本文件名$1,$2....$9 分别包含第一個到第九個命令行參數。$# 包含命令行參數的個數$@ 包含所有命令行參數: $1,$2,...$9$? 包含前一個命令的退出狀态$* 包含所有命令行參數:$1,$2,....$9$$ 包含正在執行進程的ID号

linux中shell編程實例(Linux基礎-shell編程)2

linux中shell編程實例(Linux基礎-shell編程)3

  • 預定義變量

linux中shell編程實例(Linux基礎-shell編程)4

linux中shell編程實例(Linux基礎-shell編程)5

linux中shell編程實例(Linux基礎-shell編程)6

linux中shell編程實例(Linux基礎-shell編程)7

linux中shell編程實例(Linux基礎-shell編程)8

必須在兩位數邊寫上 { } ,才能正常值一一樣。

linux中shell編程實例(Linux基礎-shell編程)9

  • 環境變量 HOME:/etc/passwd文件中列出的用戶目錄IFS: Internal Field Separator , 默認為空格,tab及換行符PATH:shell搜索路徑PS1,PS2:默認提示符($)及換行提示符(>)TERM:終端類型,常用的有vt100,ansi,vt200,xterm等。
二、shell 功能語句

shell 程序由零或多條shell語句構成。shell語句包括三類:說明性語句,功能性語句和結構性語句。

**說明性語句 ** 以 # 号開始到該行結束,不被解釋執行 功能性語句 任意的shell命令,用戶程序或其他shell程序 結構性語句 條件測試語句,多路分支語句,循環語句,循環控制語句等。

#!/bin/sh # # 本程序說明 # command_1 command_2 #command_2的語句說明 ....

常用功能性語句(命令)

==read== 從标準輸入讀入一行,并賦值給後面的變量,其語法為:

read var

把讀入的數據全部賦給var

read var1 var2 var3

把讀入行中的第一個單詞(word)賦給var1 ,第二個單詞賦給var2,.....把其餘所有的詞賦給最後一個變量。 如果執行read語句時标準輸入無數據,則程序在此停留等候,直到數據的到來或被終止運行。

#!/bin/bash echo "input a number:" read NUM echo $NUM

linux中shell編程實例(Linux基礎-shell編程)10

在這裡插入圖片描述

#!/bin/bashecho "input year month day:"read Y M Decho "Today is $Y-$M-$D"

linux中shell編程實例(Linux基礎-shell編程)11

==expr命令:== 算術運算命令expr主要用于進行簡單的整數運算,包括加( )、減(-)、乘(*)和求模(%)等操作。例如

$expr 12 5 \* 327$expr 3 - 8 / 2-1$num=9$sum=`expr $num \* 6`$echo $sum54

linux中shell編程實例(Linux基礎-shell編程)12

linux中shell編程實例(Linux基礎-shell編程)13

!!運算符間用空格分開!!

測試語句

==test語句==

test語句可測試三種對象:

字符串 / 整數 / 文件屬性

每種測試對象都有若幹測試操作符 例如:

test "$answer" = "yes" #變量answer的值是否為字符串yes test $num -eq 18 #變量num的值是否為整數18 test -d tmp #測試tmp 是否為一個目錄名

字符串測試:

s1 = s2 測試兩個字符串的内容是否完全一樣 s1 != s2 測試兩個字符串的内容是否有差異 -z s1 測試s1 字符串的長度是否為0 -n s1 測試s1 字符串的長度是否不為0

整數測試:

a - eq b 測試a 與 b是否相等 a - ne b 測試a 與 b是否不相等 a - gt b 測試a 是否大于b a - ge b 測試a 是否大于相等b a - lt b 測試a 是否小于b a - le b 測試a 是否小于等于b

#!/bin/bash A="how" B="hoW" test $A = $B echo $? //表示輸出前一個語句的結果

linux中shell編程實例(Linux基礎-shell編程)14

在這裡插入圖片描述

#!/bin/bashA="how"B="how"test $A = $Becho $? //表示輸出前一個語句的結果

linux中shell編程實例(Linux基礎-shell編程)15

相等為0(真),不等為1(假)

#!/bin/bashA="how"B="hoW"test $A = $Becho $? //表示輸出前一個語句的結果pwdecho $?ls fileecho $?

linux中shell編程實例(Linux基礎-shell編程)16

最後ls file 沒有,所以結果為2

#!/bin/bashA=99B=88test $A -ne $Becho $? //表示輸出前一個語句的結果test $A -gt $Becho $? //表示輸出前一個語句的結果

linux中shell編程實例(Linux基礎-shell編程)17

在這裡插入圖片描述

三、shell 分支語句1. 條件語句

==if ..then...fi== 語法結構:

if 表達式 then 命令表 fi

  • 如果表達式為真,則執行命令表種的命令;否則退出if語句,即執行fi後面的語句
  • if和fi是條件語句的語句括号,必須成對使用;
  • 命令表中的命令可以是一條,也可以是若幹條。

#!/bin/bash if [ $# -ne 1 ] then echo "usage : $0 filename" exit fi if ! [ -e $1 ] then echo " $1 not exist" exit fi if [ -d $1 ] then echo "$1 is a dirextory" fi

linux中shell編程實例(Linux基礎-shell編程)18

if...then ..else..fi 語句結構為:

if 表達式 then 命令表1 else 命令表2 fi

如果表達式為真,則執行命令表1中的命令,在退出if語句;否則執行命令表2中的語句,在退出if語句。

注意:無論表達式是否為真,都有語句要執行

#!/bin/bash if [ $# -ne 1 ] then echo "usage : $0 filename" exit fi if ! [ -e $1 ] then echo " $1 not exist" exit fi if [ -L $1 ] then echo "l" elif [ -d $1 ] then echo "-" elif [ -b $1 ] then echo "b" else echo "csp" fi

linux中shell編程實例(Linux基礎-shell編程)19

在這裡插入圖片描述

2. 多路分支語句

==case...esac== 多路分支語句case用于多重條件測試,語法結構清晰自然,

case 字符串變量 in //case語句隻能檢測字符串變量 模式1) 命令表1 //各模拟中可用文件名元字符,以右括号結束 ;; 模式2 | 模式3) 命令表2 ;; //命令表以單獨的雙分号行結束,退出case語句 ..... 模式n) 命令表n ;; //模式n常寫為字符*,表示所有其他模式 esac //最後一個雙分号行可以省略

判斷選擇——多路分支語句 示例1:

#!/bin/bash echo -n "please choose (yes | no)?" read R case $R in yes | Yes |y | Y |YES ) echo "yes" ;; no) echo "no" ;; *) echo "wrong" #;; esac

linux中shell編程實例(Linux基礎-shell編程)20

判斷成績——多路分支語句 示例2:

#!/bin/bashecho -n "please choose (yes | no)?"read Sif [ $S -lt 0 -o $S -gt 100]then echo "no in [0-100]"exit fiG=`expr $S / 10`case $G in9|10)echo "$S A";; 6|7|8)echo "$S B";;*)echo "$S C"#;;esac

linux中shell編程實例(Linux基礎-shell編程)21

在這裡插入圖片描述

四、shell 循環語句1. 循環語句for的用法

當循環次數已經知道或确定時候,使用for循環語句來多次執行一條或者一組命令,循環體由語句括号do和done來限定。

格式為:

for 變量名 in 單詞表 do 命令表 done

變量依次取單詞表中的各個單詞,每取一次單詞,就執行一次循環體中的命令。循環次數由單詞數确定。命令表中的命令可以是一條,也可以是由分号或換行符分開的多條。 如果單詞表是命令行上的所有位置參數時,可以在for

實例代碼:

#!/bin/bash #for I in `ls /etc` do echo "$I" done

linux中shell編程實例(Linux基礎-shell編程)22

在這裡插入圖片描述

==seq命令== :列出一系列的數字 seq 起始數字 中間分量 終止分量

#!/bin/bash for I in `seq 1 2 10` do echo "$I" done

linux中shell編程實例(Linux基礎-shell編程)23

示例:拷貝當前目錄下的所有文件到backup子目錄下。 使用語法為:./prog5.sh[filename]

#The statement of for ....do...done if [! -d $HOME/backup ] then mkdir $HOME/backup fi flist=`ls` for file in $flist //flist的值是ls的執行結果即當前目錄下的文件名 do if [ $# = 1 ] then if [ $1 = $file ] //命令行上有一個參數時 then echo "$file found" ; exit fi else cp $file $HOME/backup echo "$file copied" fi done echo ***Backup Completed******

2. 循環語句while的用法

語法結構:

while 命令或表達式 do 命令表 done

while語句首先測試其後的命令或表達式的值,如果為真,就執行一次循環體中的命令,然後再測試該命令或表達式的值,執行循環體,直到該命令或表達式為假時退出循環。

示例:

#!/bin/bash I=0 while [ $I -lt 5 ] //-lt = < do I=`expr $I 1` echo -n "input score:" read $S case `expr $S / 10` in 9|10) echo "A" ;; 6|7|8) echo "B" ;; *) echo "C" ;; esac echo "$I" done

3. 循環控制語句

==break 和 continue==

break n 則跳出n層; continue語句則馬上轉到最近的一層循環語句的下一輪循環上, continue n 則轉到最近n層循環語句的下一輪循環上。

用法:prog7 整數 整數 整數 ... 參數個數不确定,範圍為1-10個 ,每個參數都是正整數。

示例:

#!/bin/bash if [ $# -ne 5 ] then echo "argument 5" exit fi for I do if [ `expr $I % 2` -eq 1 ] then echo "$I" else break fi done

若是break 的話 ,跳出整個循環。遇到偶數就跳出循環。

linux中shell編程實例(Linux基礎-shell編程)24

#!/bin/bashif [ $# -ne 5 ]then echo "argument 5"exitfifor Idoif [ `expr $I % 2` -eq 1 ]thenecho "$I"elsecontinuefidone

若是continue的話 ,跳出當前循環。遇到偶數就跳出當前循環,繼續執行下面語句

linux中shell編程實例(Linux基礎-shell編程)25

五、shell 函數1. shell函數調用

函數調用格式:

方式1: value_name=`function_name [arg1 arg2 ...]`

函數的所有标準輸出都傳遞給了主程序的變量

方式2: function_name [arg1 arg2 ...] echo $?

獲取函數的返回狀态

獲取函數的返回狀态 ——示例:

grep_user() { R=`grep "$1" /etc/passwd | wc -l` echo $R return $R } echo -n "input username:" read USER grep_user $USER RET=$? if [ $USER -eq 1 ] then echo "$USER exist" else echo "$USER not exist" fi

linux中shell編程實例(Linux基礎-shell編程)26

若改為不返回值,用變量,函數的所有标準輸出都傳遞給了主程序的變量

grep_user(){R=`grep "$1" /etc/passwd | wc -l`echo $R}echo -n "input username:"read USERRET=`grep_user $USER`echo "----return $RET-----"if [ $USER -eq 1 ]then echo "$USER exist"elseecho "$USER not exist"fi

linux中shell編程實例(Linux基礎-shell編程)27

在這裡插入圖片描述

2. 函數變量作用域
  • 全局作用域:在腳本的其他任何地方都能夠訪問該變量
  • 局部作用域:隻能在聲明變量的作用域内訪問
  • 聲明局部變量的格式: c Local variable_name = value

grep_user() { B=200 A=100 } grep_user echo "end: $A-$B"

結果發現函數内的變量,竟然是全局變量

linux中shell編程實例(Linux基礎-shell編程)28

如果我們要局部變量就 加一個local

grep_user() { B=200 local A=100 } grep_user echo "end: $A-$B"

linux中shell編程實例(Linux基礎-shell編程)29

在這裡插入圖片描述

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved