• Linux革命性工具,shell腳本函數程式設計

    如何學習shell?

    學習Shell和學習程式設計語言都是一樣的,需要掌握基礎語言格式,按照計算機的标準寫代碼,計算機才可以正确執行指令。

    基礎内容需要進行不斷練習,而不需要刻意記憶,接下來有網友回複要多一些實戰應用,後續都會進行更新,然而,具備了基礎的文法處理能力,按照一定流程組織起來就可以完成各種複雜的項目。這就是程式設計的核心能力,程式設計邏輯。

    Linux革命性工具,shell腳本函數程式設計

    程式設計邏輯可以直接通過學習實戰樣例,在實踐中逐漸加強,也可以單獨練習算法題目,是以,有C++或者Python、Java刷題競賽的經驗,學習任何語言和項目都是事半功倍。

    Linux革命性工具,shell腳本函數程式設計

    什麼是函數?

    函數就是一個功能子產品,也可以看成是一個黑箱。比如一個絞肉機,放進去牛肉,會生成牛肉卷;放進去羊肉會生成羊肉卷。

    我們寫一個a-b之間所有數字之和的函數,比如,傳遞進去,1和100,傳回一個結果1+2+3+...+100=5050。這就是一個函數功能,使用者不需要知道這個函數如何實作,隻需知道要傳遞什麼樣的資料,可以傳回什麼資料。

    相當于我們做好一個工具包,裡面包括螺絲刀、鉗子、扳手等等,使用時候直接拿出來用就可以,工具做好可以重複使用,而這就是函數的複用性。

    Linux革命性工具,shell腳本函數程式設計

    函數的定義、調用和傳回值

    shell中的函數類似于C/C++中的函數,但return的傳回值與C/C++不同,傳回的是exit code,取值為0-255,0表示正常結束。

    如果想擷取函數的輸出結果,可以通過echo輸出到stdout中,然後通過$(function_name)來擷取stdout中的結果。

    函數的return值可以通過$?來擷取。

    指令格式:

    [function] func_name() {  # function關鍵字可以省略
        語句1
        語句2
        ...
    }           
    f(){
        echo "打開試卷"
        echo "填寫姓名"
        echo "開始答題"
    
        return 123
    }
    
    f
    
    echo $?
    echo $(f)           
    hioier@yunpc:~$ ./test.sh
    打開試卷
    填寫姓名
    開始答題
    123
    打開試卷 填寫姓名 開始答題
               

    函數參數

    函數的輸入參數

    在函數内,$1表示第一個輸入參數,$2表示第二個輸入參數,依此類推。

    注意:函數内的$0仍然是檔案名,而不是函數名。

    add(){
        a=$1
        b=$2
        echo `expr $a + $b`
    }
    
    echo $(add 1 2)
               

    遞歸求和

    sum(){
        if [ $1 -le 0 ]
        then
            echo 0
            return 0
        fi
    
        ret=$(sum `expr $1 - 1`)
        echo `expr $ret + $1`
    }
    
    echo $(sum 100)
               

    exit指令

    exit指令用來退出目前shell程序,并傳回一個退出狀态;使用$?可以接收這個退出狀态。

    exit指令可以接受一個整數值作為參數,代表退出狀态。如果不指定,預設狀态值是 0。

    exit退出狀态隻能是一個介于 0~255 之間的整數,其中隻有 0 表示成功,其它值都表示失敗。

    if [ $# -eq 1 ]
    then
        echo "yes"
        exit 0
    else
        echo "no"
        exit 1
    fi
               
    hioier@yunpc:~$ ./test.sh 0
    yes
    hioier@yunpc:~$ echo $?
    0
    hioier@yunpc:~$ ./test.sh
    no
    hioier@yunpc:~$ echo $?
    1
    hioier@yunpc:~$ cat test.sh
               

    檔案輸入輸出重定向

    add(){
        a=$1
        b=$2
        echo `expr $a + $b`
    }
    
    read -p "a:" a
    read -p "b:" b
    
    echo $(add $a $b)
               
    hioier@yunpc:~$ ./test.sh < data.in > data.out
    hioier@yunpc:~$ cat data.out
    7
               

    視訊教程

    視訊加載中...

    相關推薦

    • Linux革命性工具,shell腳本自動化
    • Linux革命性工具,shell腳本循環結構重複執行指令
    • Linux革命性工具,shell腳本選擇結構讓程式更加智能
    • Linux Shell三劍客之awk,功能強大的文本處理工具
    • 什麼是C++變量,就是存儲資料的盒子
    • C++輸入輸出流,輸出是調試程式最重要的方法

    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結

    系列文章目錄

    前言

    類加載器最核心的作用:

    1、本質工作:加載類

    2、順便可以用它來加載“類路徑下”的資源檔案,

    例如:src下(編譯後對應bin)有一個資源檔案,配置檔案:jdbc.properties

    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結

    如果我要把這裡面的檔案内容加載進來

    一、使用類加載器來加載類路徑下的資源檔案

    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結

    找不到的原因是因為,這個是相對路徑,相對路徑的資源在項目的根目錄下,不是src下

    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    • 如何擷取某個類的類加載器對象?
    • 1、擷取某個類的Class對象
    • 2、通過Class對象調用getClassLoader()方法擷取類加載器對象
      00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
      00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
      00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結

      注意:加載路徑是這個src下的根目錄即這個項目的跟目錄,如果不在這個目錄下,是無法加載到的

      00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    • ClassLoader類加載器的類型:
    • getResourceAsStream(“資源檔案的路徑名”)

      在這裡插入代碼片

      00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    • SourceFolder:源代碼檔案夾,一般會單獨用一個config這種SourceFolder來裝配置檔案、等價于src
    • 不同與普通的Folder

    如上圖,是在包裡面,在包裡面怎麼辦

    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    00024.03 反射:使用類加載器來加載類路徑下的資源檔案(包含讀取配置檔案)系列文章目錄前言一、使用類加載器來加載類路徑下的資源檔案二、完整代碼總結
    • SourceFolder:源代碼檔案夾,一般會單獨用一個config這種SourceFolder來裝配置檔案、等價于src
    • 不同與普通的Folder

    二、完整代碼

    package com.atguigu.test04;
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    import org.junit.Test;
    public class TestClassLoader2 {
    	@Test
    	public void test5() throws IOException{
    		Properties pro = new Properties();//集合,map,key=value
    		
    		Class clazz = TestClassLoader2.class;
    		ClassLoader loader = clazz.getClassLoader();
    		InputStream in = loader.getResourceAsStream("spring.properties");
    		
    		pro.load(in);
    		
    		System.out.println(pro);
    		System.out.println(pro.getProperty("user"));
    	}
    	
    	
    	@Test
    	public void test4() throws IOException{
    		Properties pro = new Properties();//集合,map,key=value
    		
    		//在項目的根路徑下,不在src裡面
    		pro.load(new FileInputStream("out.properties"));
    		
    		System.out.println(pro);
    		System.out.println(pro.getProperty("out"));
    	}
    	
    	
    	@Test
    	public void test3() throws IOException{
    		Properties pro = new Properties();//集合,map,key=value
    		
    		Class clazz = TestClassLoader2.class;
    		ClassLoader loader = clazz.getClassLoader();
    		InputStream in = loader.getResourceAsStream("com/atguigu/test04/demo.properties");
    		
    		pro.load(in);
    		
    		System.out.println(pro);
    		System.out.println(pro.getProperty("name"));
    	}
    	
    	@Test
    	public void test2() throws IOException{
    		Properties pro = new Properties();//集合,map,key=value
    		
    		Class clazz = TestClassLoader2.class;
    		ClassLoader loader = clazz.getClassLoader();
    		InputStream in = loader.getResourceAsStream("jdbc.properties");
    		
    		pro.load(in);
    		
    		System.out.println(pro);
    		System.out.println(pro.getProperty("user"));
    	}
    	
    	
    	@Test
    	public void test1() throws IOException{
    		//相對路徑在項目day24_code根目錄下,不是相對src下
    		FileReader fr = new FileReader("jdbc.properties");
    		BufferedReader br = new BufferedReader(fr);
    		String str = br.readLine();
    		System.out.println(str);
    		br.close();
    		fr.close();
    	}
    }
    
               

    總結

    在SE或者EE項目中經常要讀取配置檔案,對于配置檔案放哪,在哪讀取,這部分知識相當重要