Linux bash總結(一) 基礎部分(適合初學者學習和非初學者參考)

第一部分 bash簡介
? ??—— 對bash進行簡要介紹
第二部分 bash示例和書寫流程
? ? —— 以一個簡單的bash為例,說明書寫、執行bash的流程
第三部分 bash基礎語法
???—— 本章內容比較多,主要介紹if...else...條件判斷,for循環等等。對于有編程基礎的朋友來說應該很容易,沒有編程基礎也沒關系;參考文章中的實例,應該很容易就能掌握本章知識。
第四部分 bash數組
???—— 介紹bash數組的定義和相關操作
第五部分 函數
???—— 介紹bash函數的定義及調用方法
第六部分 數值運算
???—— 介紹+、-、*、/等操作
第七部分 字符運算
???—— 介紹字符串操作
第八部分 bash自帶參數
???—— 說明bash中自帶的參數,它們在編寫bash腳本時中經常會被用到。
第九部分 bash調試
???—— 說明bash常用的調試方法
第十部分 bash注釋
???—— 說明bash中添加單行注釋以及區域注釋的常用方法
第十一部分 bash內建指令
? ?—— 介紹bash中常用的內建命令
第十二部分 bash實例
? ?—— 以一個實例來總結基礎部分

?

第一部分 bash簡介

在介紹bash之前,需要先介紹它的起源——shell。shell俗稱殼,它是指UNIX系統下的一個命令解析器;主要用于用戶和系統的交互。UNIX系統上有很多種Shell。首個shell,即Bourne Shell,于1978年在V7(AT&T的第7版)UNIX上推出。后來,又演變出C shell、bash等不同版本的shell。
bash,全稱為Bourne-Again Shell。它是一個為GNU項目編寫的Unix shell。bash腳本功能非常強大,尤其是在處理自動循環或大的任務方面可節省大量的時間。bash是許多Linux平臺的內定Shell,這也是我們介紹它主要的原因。

?

第二部分 bash示例和書寫流程

1 新建文件test.sh

$ touch test.sh

2 添加可執行權限

$ chmod +x test.sh

3 編輯test.sh,test.sh內容如下:

#!/bin/bashecho "hello bash"exit 0

說明:
#!/bin/bash : 它是bash文件聲明語句,表示是以/bin/bash程序執行該文件。它必須寫在文件的第一行!
echo "hello bash" : 表示在終端輸出“hello bash”
exit 0 : 表示返回0。在bash中,0表示執行成功,其他表示失敗。
4 執行bash腳本

$ ./bash

在終端輸出“bash hello”

?

?

第三部分 bash基礎語法

1 條件判斷

條件判斷有2中格式,分別是“test EXPRESSION”和“[ EXPRESSION ]”。
“test”判斷語句,在實際中應用的比較少;相反的,“[]”判斷語句應用很廣。下面分別對它們進行介紹

1.1 test判斷語句

基本格式

test EXPRESSION

格式說明

test是關鍵字,表示判斷;
EXPRESSION是被判斷的語句。
關于EXPRESSION的說明,參考如下:

應用實例

一、判斷文件/home/skywang/123.txt是不是文件

$ test -f /home/skywang/123.txt

其他說明

在linux系統下,可以通過以下命令去測試上面的實例
# 切換到執行目錄(如切換到/home/skywang)

$ cd /home/skywang

# 判斷123.txt是不是文件

$ test -f 123.txt

# 輸出判斷結果,0表示成功,其他表示失敗。
# 其中,echo表示輸出文本到當前終端,$?表示上一命令的執行結果(在linux中bash中,命令成功返回0,失敗返回其他)。

$ echo $?


1.2 []條件判斷

基本格式

[ EXPRESSION ]

格式說明
中括號的左右擴弧和EXPRESSION之間都必須有空格!
關于EXPRESSION的說明,參考如下:

應用實例
一、判斷文件/home/skywang/123.txt是否存在

$ [ -f /home/skywang/123.txt ]

二、判斷變量val是否等于字符串“skywang”

$ [ "$val" = "skywang" ]

三,判斷變量num是否等于數字100

$ [ "$num" -eq "100" ]


1.3 測試邏輯表達式

基本格式
-a : 邏輯與,操作符兩邊均為真,結果為真,否則為假。
-o : 邏輯或,操作符兩邊一邊為真,結果為真,否則為假。
! : 邏輯否,條件為假,結果為真。
應用實例
一、判斷文件123.txt是不是可讀寫

$ [ -r 123.txt -a -w 123.txt ]

等價于

$ [ -r 123.txt ] && [ -w 123.txt ]

二、判斷變量num是不是等于數字101或102

$ [ "$num" -eq "101" -o "$num" -eq "102" ]

等價于

$ [ -r 123.txt ] || [ -w 123.txt ]

三、判斷文件123.txt是不是不可讀

$ [ ! -r 123.txt ]

2 if then else語句

基本格式
if 條件1
then 命令1
elif 條件2
then 命令2
else 命令3
if
格式說明
if 語句必須以單詞 fi 終止。elif 和 else 為可選項,如果語句中沒有否則部分,那么就不需要 elif 和 else 部分。if 語句可以有許多 elif 部分。最常用的 if 語句是 if then fi 結構。
應用實例
一、判斷文件文件123.txt是否存在,存在則輸出“file exist”;沒有則輸出“file not exist”。bash文件內容如下:

復制代碼
#!/bin/bashif [ -f 123.txt ];then
echo "file exist"
else
echo "file not exist"
fiexit 0
復制代碼

二、提示用戶輸入值。若輸入的值小于0,則輸出“negtive number”;若等于0,則輸出“number zero”,否則,輸出“positive number”。bash文件內容如下:

復制代碼
#!/bin/bash # 提示用戶輸入一個值 
echo -n "please input a number:"# 保存用戶輸入的值到num中 
read num if [ "$num" -lt "0" ];then 
# 小于0,則輸出“negtive number” 
echo "negtive number" 
elif [ "$num" -gt "0" ];then 
# 大于0,則輸出“positive number” 
echo "positive number" 
else
# 大于0,則輸出"number zero" 
echo "number zero"
fiexit 0
復制代碼

3 case語句

case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。
基本格式
case 值 in
模式1}
命令1
...
;;
模式2)
命令2
...
;;
esac
格式說明
“模式”部分可能包括元字符,即:
* 任意字符。
? 任意單字符。
[..] 類或范圍中任意字符
應用實例
一、提示用戶輸入Y/y或N/n。若輸入Y/y,則輸出“yes”;若輸入N/n,則輸出“no”;否則,“incorrect input”。bash文件內容如下:

復制代碼
#!/bin/bash# 提示用戶輸入一個值
echo -n "are you femail(Y/N):"# 保存用戶輸入的值到val中
read valcase $val in
Y|y) 
# 用戶輸入Y或y 
echo "yes"
;;
N|n)
# 用戶輸入N或n
"no"
;; 
*)
# 其它輸入
echo "incorrect input"
;; 
esac exit 0
復制代碼

?

4 for循環

基本格式
for 變量名in列表
do
命令1
命令2...
done
格式說明
當變量值在列表里, for循環即執行一次所有命令,使用變量名訪問列表中取值。命令可為任何有效的 shell命令和語句。變量名為任何單詞。 in列表用法是可選的,如果不用它, for循環使用命?
令行的位置參數。
應用實例
一、輸入當前文件夾的一級子目錄中文件名字。bash腳本內容如下:

復制代碼
#!/bin/bash# 將ls的結果保存到變量CUR_DIR中
CUR_DIR=`ls`# 顯示ls的結果
echo $CUR_DIRfor val in $CUR_DIR
do
# 若val是文件,則輸出該文件名
if [ -f $val ];then
echo "FILE: $val"
fi 
doneexit 0
復制代碼

?

二、輸出1-10之間數字的總和。bash腳本內容如下:

復制代碼
#!/bin/bashsum=0
for ((i=1;i<10;i++)) 
do 
((sum=$sum+$i))
done echo "sum=$sum" exit 0
復制代碼

??

5 until循環

until循環執行一系列命令直至條件為真時停止。until循環與 while循環在處理方式上剛好相反。一般 while循環優于until循環,但在某些時候 — 也只是極少數情況下, until循環更加有用。
基本格式
until 條件
命令1
...
done
格式說明
條件可為任意測試條件,測試發生在循環末尾,因此循環至少執行一次 — 請注意這一點。
應用實例
一、從0開始逐步遞增,當數值等于5時,停止遞增。Bash腳本內容如下:

復制代碼
#!/bin/bash # 設置起始值為0
val=0until [ "$val" -eq "5" ]
do
# 輸出數值
echo "val=$val"
# 將數值加1
((val++))
doneexit 0
復制代碼

?

6 while循環

基本格式
while 命令
do
命令1
命令2
...
done
應用實例
一、從0開始逐步遞增,當數值等于5時,停止遞增。Bash腳本內容如下:

復制代碼
#!/bin/bash # 設置起始值為0
val=0while [ "$val" -lt "5" ]
do
# 輸出數值
echo "val=$val"
# 將數值加1
((val++))
doneexit 0
復制代碼


7 使用break和continue控制循環

基本格式
break命令允許跳出循環。?
continue命令類似于 break命令,只有一點重要差別,它不會跳出循環,只是跳過這個循環步。
應用實例
一、[break應用]從0開始逐步遞增,當數值等于5時,停止遞增。Bash腳本內容如下:

復制代碼
#!/bin/bash# 設置起始值為0
val=0while true
do
if [ "$val" -eq "5" ];then
# 如果val=5,則跳出循環
break;
else
# 輸出數值
echo "val=$val"
# 將數值加1
((val++))
fi 
doneexit 0
復制代碼

?

二、[continue應用]從0開始逐步遞增到10:當數值為5時,將數值遞增2;否則,輸出數值。Bash腳本內容如下:

復制代碼
#!/bin/bash# 設置起始值為0
val=0while [ "$val" -le "10" ]
do
if [ "$val" -eq "5" ];then
# 如果val=5,則將數值加2
((val=$val+2))
continue;
else
# 輸出數值
echo "val=$val"
# 將數值加1
((val++))
fi 
doneexit 0
復制代碼

?

第四部分 bash數組

1 數組定義

1. array=(10 20 30 40 50)
一對括號表示是數組,數組元素用“空格”符號分割開。引用數組時從序號0開始。

2. 除了上面的定義方式外,也可以單獨定義數組:
array[0]=10
array[1]=20
array[2]=30
array[3]=40
array[4]=50

3.?var="10 20 30 40 50"; array=($var)


2 數組操作

(01) 顯示數組中第2項

$ echo ${array[i]}
說明:數組是從序號0開始計算(即第1項為array[0])。

(02) 顯示數組中的所有元素

$ echo ${array[@]}
或者
$ echo ${array[*]}

(03) 顯示數組長度

$ echo ${#array[@]}
或者
$ echo ${#array[*]}

(04) 刪除數組第2項元素

$ unset array[1]
說明:
unset僅僅只清除array[1]的值,并沒有將array[1]刪除掉

(05) 刪除整個數組

$ unset array

(06) 輸出數組的第1-3項

$ echo ${array[@]:0:3}
說明:
參考“${數組名[@或*]:起始位置:長度}”

(07) 將數組中的0替換成1

$ echo ${a[@]/0/1}
說明:
${數組名[@或*]/查找字符/替換字符

?

第五部分 函數

1 函數定義

基本格式
function 函數名()
{
...
}

格式說明
function可有可無。但建議保留,因為保留的話看起來更加直觀。

應用實例

復制代碼
function foo()
{# 定義局部變量ilocal i=0 # 定義局部變量total=傳入foo的參數總數local total=$## 輸出參數總數echo "total param =$total"# 輸出傳入foo的每一個參數for val in $@do  ((i++))echo "$i -- val=$val"done# 返回參數總數return $total
}
復制代碼

2 函數調用和傳參

調用方法

直接通過函數名去調用。

應用實例

foo param1 param2 param3

說明:

調用函數foo,并傳入param1 param2 param3三個參數

3 函數返回值

使用方法

return 返回值

方法說明

例如,foo param1 param2 param3之后,再調用$?就是上次調用的返回值

?

4 應用實例

編輯一個函數foo:打印foo的輸入參數的總數,并輸入每個參數和參數對應的序號。

復制代碼
#!/bin/bashfunction foo()
{# 定義局部變量ilocal i=0 # 定義局部變量total=傳入foo的參數總數local total=$## 輸出參數總數echo "total param =$total"# 輸出傳入foo的每一個參數for val in $@do  ((i++))echo "$i -- val=$val"done# 返回參數總數return $total
}foo
foo param1 param2 param3
# 輸出foo param1 param2 param3的返回值
echo "return value=$?"exit 0
復制代碼

?

輸出結果:

total param =0
total param =3
1 -- val=param1
2 -- val=param2
3 -- val=param3
return value=3

?

第六部分 數值運算

數值比較請參考"第三部分"的1.2節,本部分只介紹數值運算。

常用的4種數值運算說明
數值元算主要有4種實現方式:(())、let、expr、bc。
工作效率:
(()) == let > expr > bc
(01), (())和let是bash內建命令,執行效率高;而expr和bc是系統命令,會消耗內存,執行效率低。
(02), (())、let和expr只支持整數運算,不支持浮點運算;而bc支持浮點運算。

下面分別介紹這4種實現方式的使用方法。
應用實例一:分別用上面四種方式實現"3*(5+2)"。

復制代碼
#!/bin/bash# 數值i=3*(5+2) (方法一:$(())實現)
val=$((3*(5+2)))
echo "val=$val"# 數值i=3*(5+2) (方法二:let實現)
let "val=3*(5+2)"
echo "val=$val"# 數值i=3*(5+2) (方法三:expr實現)
val=`expr 3 \* \( 5 + 2 \)`
echo "val=$val"# 數值i=3*(5+2) (方法四:bc實現)
val=`echo "3*(5+2)"|bc`
echo "val=$val"exit 0
復制代碼

應用實例二:分別勇上面四種方式實現“數值+1”。

復制代碼
#!/bin/bashval=0
# 數值加1 (方法一)
((val++))
echo "val=$val"val=0
# 數值加1 (方法二)
let val++
echo "val=$val"val=0
# 數值加1 (方法三)
val=`expr $val + 1`
echo "val=$val"val=0
# 數值加1(方法四)
val=`echo "$val+1"|bc`
echo "val=$val"exit 0
復制代碼

應用實例三:計算1/3,保留3位小數。

復制代碼
#!/bin/bash# 數值i=3*(5+2) (方法四:bc實現)
val=`echo "scale=3; 1/3"|bc`
echo "val=$val"exit 0
復制代碼

?

第七部分 字符運算

1 字符串定義

?

2 字符串操作

2.1 string操作公式表

2.2 應用實例

首先,我們定義個str字符串變量,然后再對此變量進行字符串操作。

$ str="hello world"

(01) 顯示字符串長度

$ echo ${#str}

(02) 提取world

$ echo ${str:6}

(03) 提取or

$ echo ${str:7:2}

(04) 刪除hello

$ echo ${str#hello}
或
$ echo ${str#*lo}

(05) 刪除world

$ echo ${str%world}$ echo ${str%wo*}

(06) 將所有的字符“l”替換為“m”

$ echo ${str//l/m}

?

第八部分 bash自帶參數

?

第九部分 bash調試

1 bash命令調試

bash [-nvx] scripts.sh
選項與參數:
-n :不要執行 script,僅查詢語法的問題;
-v :再執行 sccript 前,先將 scripts 的內容輸出到屏幕上;
-x :將使用到的 script 內容顯示到屏幕上,這是很有用的參數!
例如,想要執行bash腳本,并查看bash的調用流程,可以通過以下命令:

$ bash -x test.sh

2 echo調試
echo [OPTION] STRING
-n : 輸出內容之后,不換行。默認是輸入內容之后,換行。
-e : 開啟反斜線“\”轉義功能
-E : 開啟反斜線“\”轉義功能(默認)。
例如,輸出“please input a number:”之后不換行。

$ echo -n "please input a number:"

3 printf
和echo一樣,printf也能用于輸出。語法格式和C語言中printf一樣。
例如,輸出“hello printf”之后換行。

$ printf "hello printf\n"

?

第十部分 bash注釋

1 單行注釋

# echo "single line"
說明:#放在文件開頭,表示注釋掉本行。

2 多行注釋

可以通過以下兩種方法實現多行注釋:

:||{
....被注釋的多行內容
}

或者

if false ; then
....被注釋的多行內容
fi

?

第十一部分 bash內建指令

1 內建命令查看方法

基本格式
type cmd
格式說明
type是命令關鍵字,cmd表示查看的命令;若輸出builtin,則該命令是bash的內建命令。
例如:

$ type echo

除此之外,用戶也可以通過man bash或者man builtins查看bash的全部內置命令.

2 常用內建命令說明

(01)echo
命令:echo arg
功能:在屏幕上顯示出由arg指定的字串
(02)read
命令格式:read變量名表
功能:從標準輸入設備讀入一行,分解成若干字,賦值給bash程序內部定義的變量
(03)shift
命令:shift [N] (N為大于0的整數;當N省略時,等價與于“shift 1”)
功能:所有的參數依次向左移動N個位置,并使用$#減少N,直到$#=0為止。
(04)alias
命令:alias name='value'
功能:別名。用name替換value,value要用單引號括住。
(05)export
命令:export變量名[=變量值]
功能:export可以把bash的變量向下帶入子bash(即子bash中可以使用父bash的變量),從而讓子進程繼承父進程中的環境變量。但子bash不能用export把它的變量向上帶入父bash。
(06)readonly
命令:readonly 變量名
功能:定義只讀變量。不帶任何參數的readonly命令將顯示出所有只讀變量。
(07)exec
命令:exec 命令參數
功能:當bash執行到exec語句時,不會去創建新的子進程,而是轉去執行指定的命令,當指定的命令執行完時,該進程(也就是最初的bash)就終止了,所以bash程序中exec后面的語句將不再?
被執行。
(08)"."(點)
命令:. bash程序文件名
功能:使bash讀入指定的bash程序文件并依次執行文件中的所有語句。
(09)exit
命令:exit N
功能:退出Shell程序。在exit之后可有選擇地指定一個數位作為返回狀態。

?

第十二部分 bash實例

實例一:備份/更新文件的腳本
01, 編寫一個腳本文件backup.sh,備份android、kernel或uboot中的文件,備份的時候要保留文件在備份文件夾(即保留文件的相對路徑)。
(01) 新建list_file.txt,并在list_file.txt中記錄要備份的文件的路徑。
(02) 當執行“./backup.sh bb”命令時:backup.sh會新建bb目錄,然后讀取list_file.txt中記錄的文件路徑,并將記錄的文件路徑對應的文件備份到bb目錄下。
(03) 當執行“./backup.sh tt”命令時,backup.sh會判斷是否存在tt目錄,若存在tt目錄的話,則tt中的文件更新到list_file.txt所記錄的文件路徑;否則的話,不更新文件。

腳本內容如下:

?

復制代碼
#!/bin/bash##############################NOTE############################
#
# AUTHOR      : skyWang
# DATE        : 2012-07-16
# DESCRIPTION : 用于備份文件 or 更新文件
#
#               1. 備份文件
#               (1) 備份命令        :  ./run.sh bb
#               (2) 備份文件所在目錄:  bb
#                   這個是在步驟(1)之后,在當前目錄下自動建立bb目錄
#              
#               2. 更新文件
#               (1) 更新命令        :  ./run.sh tt
#               (2) 更新文件所在目錄:  tt
#                   這個是必須在步驟(1)之前已經存在的目錄。因為,就是為了用tt目錄中的文件去替換到目標文件。
#
# OTHER       : 1. list_file.txt 文件說明(即,list_file.txt中的文件必須滿足一下條件):
#               “變量COMMPATH_PATH的值”和“list_file.txt中的每一行內容”組合起來得到的完整路徑所對應的文件,必須存在!
#
#               例如: COMMON_PATH=/root/
#                      list_file.txt中有以下1行內容:
#                      android/build/core/Makefile
#               這樣,“變量COMMPATH_PATH的值”和“list_file.txt中的行”組合起來得到的完整路徑就是:
#                      /root/android/build/core/Makefile
#
#                “/root/android/build/core/Makefile”這個文件必須存在于電腦中。
#
#               (1)若list_file.txt滿足以上條件,運行“./run.sh bb”就可以備份“/root/android/build/core/Makefile”。
#                    備份時,會自動(在當前目錄下)建立目錄“bb”,并將文件備份到“bb”目錄下
#               (2)若將bb目錄重命名成tt,運行“./run.sh tt”就可以將“tt”中的文件更新到“/root/android/build/core/Makefile”。
#               
#
##############################NOTE#####################################TODO...START#########
# 假設android、kernel、uboot在同一級目錄;
# 則,COMMON_PATH是它們所在目錄的路徑。
COMMON_PATH=/home/skywang/a8/gingerbread/code/
#########TODO...END####################CONSTANT...START#########
LIST_FILE="list_file.txt"
B_FOLDER="bb/"
T_FOLDER="tt/"
# android工程的文件夾名字
ANDROID_FOLDER="android"
# kernel工程的文件夾名字
KERNEL_FOLDER="kernel"
# uboot工程的文件夾名字
UBOOT_FOLDER="uboot"
# android長度
ANDROID_FOLDER_LEN=`expr length "$ANDROID_FOLDER"`
# kernel長度
KERNEL_FOLDER_LEN=`expr length "$KERNEL_FOLDER"`
# uboot長度
UBOOT_FOLDER_LEN=`expr length "$UBOOT_FOLDER"`
#########CONSTANT...END############ 功能說明:根據源文件和目標文件所在完整路徑,將源文件更新到目標文件
#           更新成功的話,輸出更新的起止路徑;否則,打印錯誤信息
# 輸入參數:src_full_path    —— 源文件所在完整路徑。
#           dst_full_path    —— 目標文件所在完整路徑。
#           例如:src_full_path="tt/android/hardware/libsensor/sensors.cpp"
#                 dst_full_path="/home/skywang/mnt/sda6/a8/a72/3g/iceCreamSandwish/code/android/hardware/libsensor/sensors.cpp"
function func_update_file_by_path()
{local src_full_path=$1local dst_full_path=$2local dst_full_dir=`dirname $dst_full_path`if [ -f "$src_full_path" ];thenif [ -e "$dst_full_path" ] || [ -d "$dst_full_dir" ];thencp -v $src_full_path $dst_full_pathelsemkdir -p $dst_full_dircp -v $src_full_path $dst_full_pathfielseecho copy file ERROR:echo file $src_full_path not existes!!!fi
}# 功能說明:將“輸入文件”中全部文件全部更新到代碼中
#           更新成功的話,輸出更新的起止路徑;否則,打印錯誤信息
# 輸入參數:input_file    ——    “輸入文件”所在的完整路徑
#           例如:input_file="/home/skywang/mnt/sda6/a8/a72/3g/iceCreamSandwish/backup/exmaple/list_file.txt"
function func_push_files()
{local input_file=$1local full_pathlocal backup_pathlocal count=0while read -r linedolet count=`expr $count + 1`if [ `expr match $line $ANDROID_FOLDER` == "$ANDROID_FOLDER_LEN" ] || [ `expr match $line $KERNEL_FOLDER` == "$KERNEL_FOLDER_LEN" ] || [ `expr match $line $UBOOT_FOLDER` == "$UBOOT_FOLDER_LEN" ];thenecho "$count : right push path"src_path=${T_FOLDER}${line}dst_path=${COMMON_PATH}${line}func_update_file_by_path $src_path $dst_pathelseecho "$count : push file $line is invalidate!"fidone < $input_file}# 功能說明:根據源文件所在完整路徑,將源文件拷貝到另一個目錄下
#           備份成功的話,輸出備份的起止路徑;否則,打印錯誤信息
# 輸入參數:src_full_path    —— 源文件所在完整路徑。
#           dst_full_dir    —— 目標路徑
#           例如:src_full_path="/home/skywang/mnt/sda6/a8/a72/3g/iceCreamSandwish/code/android/hardware/libsensor/sensors.cpp"
#                 dst_full_dir="bb/android/hardware/libsensor/"
function func_backup_file_by_path()
{local src_full_path=$1local dst_full_dir=$2"/"if [ -f "$src_full_path" ];thenif [ -d "$dst_full_dir" ];thencp -v $src_full_path $dst_full_direlsemkdir -p $dst_full_dircp -v $src_full_path $dst_full_dirfielseecho backup file ERROR:echo file $src_full_path not existes!!!fi
}# 功能說明:將“輸入文件”中全部文件全部做備份。
#           備份成功的話,輸出備份的起止路徑;否則,打印錯誤信息
# 輸入參數:input_file    ——    “輸入文件”所在的完整路徑
#           例如:input_file="/home/skywang/mnt/sda6/a8/a72/3g/iceCreamSandwish/backup/exmaple/list_file.txt"
function func_pull_files()
{local input_file=$1local full_pathlocal backup_pathlocal count=0while read -r linedolet count=`expr $count + 1`if [ `expr match $line $ANDROID_FOLDER` == "$ANDROID_FOLDER_LEN" ] || [ `expr match $line $KERNEL_FOLDER` == "$KERNEL_FOLDER_LEN" ] || [ `expr match $line $UBOOT_FOLDER` == "$UBOOT_FOLDER_LEN" ];thenecho "$count : right pull path"full_path=${COMMON_PATH}${line}backup_path=${B_FOLDER}`dirname $line`func_backup_file_by_path $full_path $backup_pathelseecho "$count : pull file $line is invalidate!"fidone < $input_file}func_copy_all_files()
{if [ ! -e "$LIST_FILE" ];thenecho ERROR: the file $LIST_FILE not existes!!!exit 1ficase $1 inBB|bb)echo -e "\n\n==============backup files=============="func_pull_files $LIST_FILE && exit 0;;TT|tt)echo -e "\n\n==============syn    files=============="func_push_files $LIST_FILE && exit 0;;*)echo ERROR parameter: please input parameter \"bb\" to backup, or \"tt\" to update!!!
            ;;esac
}func_copy_all_files $1exit 0
復制代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451586.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451586.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451586.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用 Python 語言來寫游戲

每個程序員差不多都是從計算機愛好者開始的&#xff0c;尤其是那些令人心醉神迷的電腦游戲&#xff0c;不僅造就了整個游戲產業&#xff0c;推動了計算機行業軟硬件的升級&#xff0c;而且吸引了大量的愛好者最終加入了游戲軟件開發的行業。騰訊、網易、盛大、完美時空等公司的…

各種操作系統簡介和功能分析

Windows 開發商 Microsoft Windows98/me Windows2000/XP Windows Server2003 Windows Vista Windows98/me是基于MS-DOS的混合的16/32位操作系統正慢慢的退出PC舞臺了,2000/X P以及Server2003都是基于WindowsNT的32位操作系統,XP/Server2003已經有64位版本了。 Vista是微軟最…

Cookie與Session的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 cookie機制 Cookies是服務器在本地機器上存儲的小段文本并隨每一個請求發送至同一個服務器。IETF RFC 2965 HTTP State Management Mec…

python實現簡易工資管理系統(Salary Manage)源碼

一、需求&#xff1a; 1.導入文件讀取員工的信息和工資信息&#xff0c;最后將增加、刪除或修改的員工工資信息寫入原來的文件中 2.能夠實現員工工資信息的增刪改查 3.當增加和修改員工信息時用戶用空格分隔員工姓名和薪資 4.實現退出功能 二、思路 1.首先需要將包含有員工薪資…

python 的作用

print正常是要輸出到屏幕上&#xff0c;如果你希望輸出到其他地方比如文件&#xff0c;就需要使用>>來把輸出導向到文件。空格的目的是要區分關鍵詞&#xff0c;如果你輸入的是print>>&#xff0c;電腦會把它當成一個單詞&#xff0c;而無法知道是print函數。

操作系統內存管理

參考文獻&#xff1a; 20 張圖揭開內存管理的迷霧 感謝三太子敖丙分享&#xff01;

hexo github搭建博客常用的命令

這些命令你都用過嗎&#xff1f; npm install hexo -g #安裝 npm update hexo -g #升級 hexo init #初始化 hexo new "postName" #新建文章 hexo new page "pageName" #新建頁面 hexo generate #生成靜態頁面至public目錄 hexo server #開啟預覽訪問端口&a…

寫博客的好處,專家告訴你

把自己平時在做項目時和自己學習時的一些經驗和心得記錄下來。那樣&#xff0c;首先可以增強自己對知識點的理解&#xff1b;其次&#xff0c;以后再用到的話&#xff0c;可以很方便的查詢&#xff1b;最后&#xff0c;才是分享給大家&#xff0c;可以在用到這方面的知識的時候…

解決報錯:java.util.UnknownFormatConversionException: Conversion = ‘p‘

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. ssm框架下 報錯如題 2. 錯誤原因&#xff1a;我的情況是&#xff0c;代碼中實體屬性映射書寫和數據庫字段名字不一致。 選中位置數據…

JVM和JMM的區別

參考文獻&#xff1a; java中JVM和JMM之間的區別 感謝作者分享&#xff01;

[Java][網絡編程]服務端向客戶端發送信息

/*前置知識&#xff08;服務端&#xff09;1.首先要常見一個ServerSocket對象 服務端套接字&#xff0c;并且在服務端套接字里面確定需要使用的端口2.然后要創建一個Socket對象來接收ServerSocket的返回值。通常一個Socket對象對應一個客戶端/涉及到多個客戶端需要通過線程來解…

【Python】如何判斷一個字符串為空

#方法一 if oneString: print "not empty" else: print "empty" #方法二 if oneString "": print "empty" else: print "not empty"

LRU 實現緩存

LRU:Least Recently used 最近最少使用 1.使用LinkedHashMap實現 inheritance實現方式 繼承map類 可以使用Collections.synchronizedMap方式實現線程安全的操作 public class LruCache<K,V> extends LinkedHashMap<K,V> {private final int MAX_CACHE_SIZE;public …

使用vsftp作為集群的yum倉庫

地址規劃&#xff1a;vsftp服務器的地址為172.16.1.61使用的環境&#xff1a;[rootnfs01 scripts]# uname -a Linux nfs01 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux首先在yum服務器上掛載本地光盤mkdir /media/cdrom ;mount…

純做技術是自娛自樂 拋開技術做技術才是出路

短短一生不過數十載&#xff0c;對于很多人而言&#xff0c;作IT、作技術只是生命中的某一段&#xff0c;并非所有。而無論是換工作還是換行業&#xff0c;只是一種形式而已&#xff0c;最終我們追求的是成功、是榮譽、是收獲。于是在年輕的這幾年里&#xff0c;作為技術人員理…

TOAD連接Oracle數據庫失敗:OCI_INVALID_HANDLE解決

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. toad 連接Oracle數據庫連接失敗如圖&#xff1a; 2. 導致這個情況的前因&#xff1a;toad運行情況下&#xff0c;突然斷電。 3. 解決…

多線程三大特性:原子性、有序性、可見性

參考文獻&#xff1a;三大性質總結&#xff1a;原子性&#xff0c;有序性&#xff0c;可見性 感謝作者分享&#xff01;

git checkout 和 git reset

git checkout 主要有三個作用&#xff1a; 第一個就是切換分支。例如你從遠程倉庫clone下來所有的源代碼&#xff0c;你git branch一下會看到你通常是在master&#xff0c;如果你想切換到某一個分支上呢&#xff1f;git checkout <branchname>第二個就是放棄對某個文件的…

python-訪問者模式

源碼地址:https://github.com/weilanhanf/PythonDesignPatterns 說明&#xff1a; 訪問者模式的基本想法是&#xff0c;軟件系統中擁有一個由許多對象構成的、比較穩定的對象結構&#xff0c;這些對象的類都擁有一個 accept 方法用來接受訪問者對象的訪問。訪問者是一個接口&am…

面試題:Fibonacci數列

題目描述&#xff1a;大家都知道斐波那契數列&#xff0c;現在要求輸入一個整數n&#xff0c;請你輸出斐波那契數列的第n項&#xff08;從0開始&#xff0c;第0項為0&#xff09;。 方法1&#xff1a;遞歸 public class Solution {public int Fibonacci(int n) {if (n 0){retu…