S905L3A(M401A)拆解, 運行EmuELEC和Armbian. S905Lx系列屬於大客戶版本, 對外沒有公開資料, 最早的 S905L/S905LB 是 S905X 的馬甲, 而這個 S905L3A/S905L3AB 則是 S905X2 的馬甲, 因為在性能評測里這兩個U的得分幾乎一樣.... ...
3 函數
在本章中,您將瞭解為什麼以及何時需要使用函數。 你將學習如何創建函數以及如何使用函數。 我們將討論變數及其作用域。 學習如何使用參數訪問傳遞給函數的參數。 最後,您還將學習如何使用函數處理退出狀態和返回代碼。
電腦編程和應用程式開發中有一個概念叫做 DRY。 DRY 是 "不要重覆"(Don't Repeat Yourself)的縮寫。 通過函數,您只需編寫一次代碼塊,即可多次使用。每次需要執行特定任務或功能時,只需調用包含該代碼的函數,而無需重覆幾行代碼。這有助於縮短腳本的長度,還能讓您在一個地方對給定任務進行更改、測試、故障排除和記錄。所有這些都使腳本更易於維護。
每當您需要在腳本中多次執行同一操作時,這就表明您可能應該為該操作編寫函數。 函數只是可重覆使用的代碼塊,它執行操作並返回退出狀態或返回代碼。 函數在調用前必須先定義。 調用函數時,可以向函數傳遞數據。 您可以在函數中以參數的形式訪問這些數據。
3.1 創建函數
創建函數有兩種方法。 第一種方法是明確使用關鍵字function,然後在關鍵字後面加上函數名稱和括弧。 然後使用開頭的大括弧。 當函數被調用時,後面的代碼或命令將被執行。要結束函數,請使用結尾大括弧。
function function-name() {
# Code goes here.
}
聲明函數的第二種方法與第一種完全相同,只是在聲明中不使用關鍵字 unction。 其他一切保持不變。
function-name() {
# Code goes here.
}
3.2 調用函數
要調用函數,只需在腳本中列出函數名稱即可。 調用函數時,不要使用括弧。 你可能在其他編程語言中見過這種語法和樣式,但在shell腳本中不起作用。 只需將函數名稱放在一行中,它就會執行該函數。
運行此腳本時,屏幕上會顯示 "Hello!"。
#!/bin/bash
function hello() {
echo "Hello!"
}
hello
執行:
$ ./functions-01.sh
Hello!
函數可以調用其他函數:
#!/bin/bash
function hello() {
echo "Hello!"
now
}
function now() {
echo "It's $(date +%r)"
}
hello
執行:
Hello!
It's 下午 08時42分21秒
函數必須在使用前聲明,不要這樣做:
#!/bin/bash
function hello() {
echo "Hello!"
now
}
# This will cause an error as the "now()" function is not yet defined.
hello
function now() {
echo "It's $(date +%r)"
}
執行:
$ ./functions-03.sh
Hello!
./functions-03.sh: line 5: now: command not found
腳本語言不是預編譯的。 在某些語言中,你可以在任何地方定義函數,編譯器會檢查所有源代碼,然後將它們拼湊在一起,最終執行程式。 在腳本中,命令和組件會在運行時從上到下讀取。最好將所有函數放在腳本的頂部。 這樣可以確保在使用前定義好所有函數。
3.3 位置參數
使用$1、2等參數訪問這些傳入參數的值。 唯一不同的是,$0仍然是腳本本身的名稱。您不能使用 $0 訪問函數的名稱,但好消息是,無論如何您都不會真的想這樣做。
要向函數發送數據,請在函數名稱後輸入數據。 在本例中,hello 函數的調用只有一個參數,即 Jason 。 這意味著 hello 函數中 $1 的內容是 "Jason"。 正如你所猜測的,這個腳本的輸出就是 "Hello Jason"。
#!/bin/bash
function hello() {
echo "Hello $1"
}
hello Jason
執行:
$ ./functions-04.sh
Hello Jason
下麵腳本將迴圈處理傳遞給hello函數的每個參數:
#!/bin/bash
function hello() {
for NAME in $@
do
echo "Hello $NAME"
done
}
hello Jason Dan Ryan
執行:
$ ./functions-05.sh
Hello Jason
Hello Dan
Hello Ryan
參考資料
- 軟體測試精品書籍文檔下載持續更新 https://github.com/china-testing/python-testing-examples 請點贊,謝謝!
- 本文涉及的python測試開發庫 謝謝點贊! https://github.com/china-testing/python_cn_resouce
- python精品書籍下載 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品書籍下載 https://www.cnblogs.com/testing-/p/17438558.html
3.4 變數作用域
預設情況下,所有變數都是全局變數。 這意味著變數及其值可以在腳本的任何地方訪問,包括在任何函數中。在使用變數之前,必須先定義變數。
#!/bin/bash
my_function() {
echo "$GLOBAL_VAR"
}
GLOBAL_VAR=1
# The value of GLOBAL_VAR is available to my_function
my_function
執行:
$ ./functions-06.sh
1
如果在函數中定義了全局變數,那麼在函數被調用和執行之前,它在函數之外是不可用的。
#!/bin/bash
my_function() {
echo "$GLOBAL_VAR"
}
# The value of GLOBAL_VAR is NOT available to my_function since GLOBAL_VAR was defined after my_function was called.
my_function
GLOBAL_VAR=1
執行:
./functions-07.sh
#!/bin/bash
my_function() {
GLOBAL_VAR=1
}
# GLOBAL_VAR not available yet.
echo "GLOBAL_VAR value BEFORE my_function called: $GLOBAL_VAR"
my_function
# GLOBAL_VAR is NOW available
echo "GLOBAL_VAR value AFTER my_function called: $GLOBAL_VAR"
執行:
$ ./functions-08.sh
GLOBAL_VAR value BEFORE my_function called:
GLOBAL_VAR value AFTER my_function called: 1
3.5 局部變數
局部變數是指只能在聲明它的函數中訪問的變數。 在變數名前使用local關鍵字。 只有在首次使用局部變數時才使用local關鍵字。最佳做法是在函數內部使用局部變數。
#!/bin/bash
my_function() {
local LOCAL_VAR=1
echo "LOCAL_VAR can be accessed inside of the function: $LOCAL_VAR"
}
my_function
# LOCAL_VAR is not available outside of the function.
echo "LOCAL_VAR can NOT be accessed outside of the function: $LOCAL_VAR"
執行:
./functions-09.sh
LOCAL_VAR can be accessed inside of the function: 1
LOCAL_VAR can NOT be accessed outside of the function:
3.6 退出狀態和返回代碼
函數也有退出狀態,有時也稱為返回代碼。 可以通過使用return語句明確設置退出狀態,併在後面加上希望返回的狀態。 如果不使用返回語句,函數的退出狀態就是函數中最後執行的命令的退出狀態。
返回語句只接受數字。 只有介於0和255之間的整數才能用作退出狀態。 退出狀態為0表示命令或函數成功完成。非0的退出狀態表示某種類型的錯誤。要訪問函數的退出狀態,請在調用函數後立即使用$?。
在本代碼段中,$?的值將是 my_function 函數的退出狀態。
my_function
echo $?
實例:backup_file函數將創建文件的備份,並將其放入/var/tmp目錄。
#!/bin/bash
function backup_file () {
# This function creates a backup of a file.
# Make sure the file exists.
if [ -f "$1" ]
then
# Make the BACKUP_FILE variable local to this function.
local BACKUP_FILE="/tmp/$(basename ${1}).$(date +%F).$$"
echo "Backing up $1 to ${BACKUP_FILE}"
# The exit status of the function will be the exit status of the cp command.
cp $1 $BACKUP_FILE
else
# The file does not exist, so return an non-zero exit status.
return 1
fi
}
# Call the function
backup_file /etc/hosts
# Make a decision based on the exit status of the function.
# Note this is for demonstration purposes. You could have
# put this functionality inside of the backup_file function.
if [ $? -eq "0" ]
then
echo "Backup succeeded!"
else
echo "Backup failed!"
# Abort the script and return a non-zero exit status.
exit 1
fi
執行:
$ ./functions-10.sh
Backing up /etc/hosts to /tmp/hosts.2023-08-26.11232
Backup succeeded!
釘釘或微信號: pythontesting 微信公眾號:pythontesting