Shell就是一個命令行解釋器,它的作用就是遵循一定的語法將輸入的命令加以解釋并傳給系統。它為用戶提供了一個向Linux發送請求以便運行程序的接口系統級程序,用戶可以用Shell來啟動、掛起、停止甚至是編寫一些程序。 Shell本身是一個用C語言編寫的程序,它是用戶使用Linux的橋梁。Shell既是一種命令語言,又是一種程序設計語言(就是你所說的shell腳本)。作為命令語言,它互動式地解釋和執行用戶輸入的命令;作為程序設計語言,它定義了各種變量和參數,并提供了許多在高階語言中才具有的控制結構,包括循環和分支。它雖然不是 Linux系統內核的一部分,但它調用了系統內核的大部分功能來執行程序、創建文檔并以并行的方式協調各個程序的運行。
Shell語言
使用Shell編譯靜態庫,Shell種類非常多,Bash是其中的一個使用最多的種類(免費,易用)
我使用的是mac本,自帶Shell腳本開發
Hello world!
1、首先創建一個腳本文件:touch hello.sh
2、編寫Shell程序
#定義文件聲明 !表示約定標記, 它會高斯系統這個腳本需要什么樣的解釋器來執行,即一種腳本體現
#!/bin/bash
echo "Hello world!"
3、修改文件權限
首先查看文件權限:ls -l hello.sh
修改權限:chmod +x ./hello.sh
4、執行腳本文件
命令:./hello.sh
語法
1、注釋
# 表示注釋
在Shell腳本中沒有多行注釋,只有單行注釋
2、變量
變量定義注意事項:
- 定義變量時候,變量名不需要加$符號
- 變量名和等號不能夠有空格
- 變量名首字母必須是是字母或者下劃線(a_z,A_Z)
- 變量名中間不允許有空格
2.1只讀變量:關鍵字readonly
name="小生生"
readonly name
_age=18
name="小白"
echo $name
echo $_age
這段代碼會有警告:#readonly variable
2.2刪除變量
語法:unset 變量名
只讀變量 無法刪除
2.3變量類型
- 本地變量,作用域:整個bash進程可以使用 語法: name="xiaoming"
- 局部變量,作用域:當前代碼段(修飾符local) 語法:local name="xiaohong"
- 環境變量,作用域:當前shell進程以及子進程 語法:export name="xiaohei"
- 位置變量,給我們腳本文件傳遞參數 使用${數字} 0表示文件名稱,從1開始 執行的時候可以傳參,/hello.sh xiaohong 150 男
#給我們的腳本文件傳遞參數
name=${1}
age=${2}
sex=${3}
echo "姓名:${name}, 年齡 ${age}, 性別 ${sex}"
- 特殊變量:
1)${0}文件名稱
2)${?}表示返回上一個命令執行狀態返回值:0表示成功,1表示執行結果,2表示程序狀態返回碼(0-255)系統預留錯誤(1,2,127)- $# 表示參數的個數
4)$* 或者 $@ 表示參數列表(區別:前者將所有參數組成一個字符串,后者分開的字符串)
5)$$ 獲取當前shell進程ID
6) $! 表示執行上一個指令的PID(進程ID)
- $# 表示參數的個數
3、字符串
3.1 單引號
name='Andy'
3.2 雙引號
name="Andy"
3.3 字符串拼接
方式一
name='Andy'
age=18
sex=2
info=${name}${age}${sex}
echo $info
方式二
name='Andy'
age=18
sex=2
info="${name},${age},${sex}"
echo $info
3.4 獲取字符串長度
語法結構:${#變量名}
name="Andy"
echo ${#name}
3.5 字符串截取
語法:${變量名:開始位置:截取位置}
name="I am Andy"
length=${#name}
result=${name:5:length-1}
echo $result
3.6字符串刪除
語法一:${變量名#刪除字符串 正則表達式}
作用:從字符串開頭開始匹配要刪除的字符串
#刪除頭字符 只能刪除從頭開始的
name="I am Andy"
result=${name#I}
echo $result 結果am Andy
#查找制定字符,并刪除前面所有字符(包含自己)
name="I am Andy"
result=${name#*A}
echo $result 結果ndy
#刪除制定范圍(只能從第一個開始刪除,刪除到那里)
name="I am Andy"
result=${name#I*A}
echo $result 結果ndy
語法二:${變量名##刪除字符串 正則表達式}
作用:從字符串的結尾開始匹配 刪除字符串
name="I am Andy"
result=${name##*A}
echo $result 結果ndy
語法三:${變量名%刪除字符串 正則表達式}
作用:從字符串結尾開始匹配,刪除匹配的字符串
name="I am Andy"
result=${name%Andy}
echo $result
#查找自定字符第一個,并刪除前面所有字符(包含自己)
name="I am Andy"
result=${name%A*}
echo $result 結果 I am
4、布爾運算符
“!”:非運算,
a=100
b=200
if [ $a != $b ]
then
echo "a不等于b"
fi
“-o”:或運算
a=100
b=200
if [ $a -lt 200 -o $b -gt 200 ]
then
echo "成立"
fi
“-a”: 與運算
a=100
b=200
if [ $a -lt 200 -a $b -gt 200]
then
echo "成立"
else
echo "不成立"
fi
5、邏輯運算符
"&&":邏輯且
a=100
b=00
if [ $a -lt 200 ] && [ $b -gt 200 ]
then
echo "成立"
else
echo "不成立"
fi
“||”:邏輯或
a=100
b=200
if [ $a -lt 200 ] || [$b -gt 200 ]
then
echo "成立"
else
echo "不成立"
fi
6、字符串運算
6、1
“=”:檢測兩個字符串是否相等,如果相同則返回true
a="Andy"
b="你好"
if [ $a = $b ]
then
echo "字符串相等"
else
echo "字符串不相等"
fi
6、2
“!=”:檢測兩個字符串是否相等,如果不相等返回true
a="Andy"
b="你好"
if [ $a != $b ]
then
echo "字符串a不等于字符串b"
else
echo "字符串a等于字符串b"
fi
“-z”:檢測字符串的長度是否為0,如果是返回true
a="Andy"
if [ -z $a ]
then
echo "a不存在"
else
echo "a存在"
fi
“-n”:檢測字符串長度是否為0,如果不是0,返回true
a="Andy"
if [ -n "$a" ]
then
echo "a存在"
else
echo "a不存在"
fi
7、文件測試運算符
file="/Users/zhaoruisheng/Desktop"
"-d file":檢測一個文件是不是一個目錄,如果是返回true
file="/Users/zhaoruisheng/Desktop"
if [ -d $file ]
then
echo "是一個目錄"
else
echo "不是一個目錄"
fi
"-r file":檢測文件是否可讀,如果是返回true
file="/Users/zhaoruisheng/Desktop/Shell/hello.sh"
if [ -r $file ]
then
echo "可讀"
else
echo "不可讀"
fi
"-w file:檢測文件是否可寫,如果是返回true
file="/Users/zhaoruisheng/Desktop/Shell/hello.sh"
if [ -w $file ]
then
echo "可寫"
else
echo "不可寫"
fi
"-x file":檢測文件是否是可執行文件,如果是,那么返回true
file="/Users/zhaoruisheng/Desktop/Shell/hello.sh"
if [ -w $file ]
then
echo "可執行"
else
echo "不可執行"
fi
"-f file"檢測一個文件是否是普通文件(既不是目錄,也不是設備文件),如果是返回true
file="/Users/zhaoruisheng/Desktop/Shell/hello.sh"
if [ -f $file ]
then
echo "普通文件"
else
echo "系統文件"
fi
"-s file":檢測文件是否為空(文件有內容),如果是,那么返回true
file="/Users/zhaoruisheng/Desktop/Shell/hello.sh"
if [ -s $file ]
then
echo "文件有內容"
else
echo "文件沒有內容"
fi
"-e file":檢測文件是否存在(包含了:目錄和文件),如果是,返回true
file="/Users/zhaoruisheng/Desktop/Shell/hello.sh"
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
控制流程
1、if語句
語法結構:
if [條件]
then
代碼
fi
if else 語句
if [條件]
then
代碼
else
代碼
fi
if-else-if-else
語法結構
if [條件]
then
代碼
elif [條件]
then
代碼
else
代碼
fi
2、switch
語法結構
case 值 in
模式1)
代碼
;;
模式2)
代碼
;;
模式3)
代碼
;;
esac
number=1
case $number in
1) echo "等于1";;
2) echo "等于2";;
3) echo "等于3";;
esac
3、for循環
語法結構
for 變量名 in item1 item2 ...
do
代碼
done
for name in "Andy" "小黑" "小吧"
do
echo $name
done
#讀取文件通配符
file="/Users/zhaoruisheng/Desktop/Shell/*"
for name in ${file}
do
echo $name
done
#嵌套循環
for ((a = 1; a < 5; a++ ))
do
echo $a
for ((b = 1; b < 5; b++ ))
do
echo $b
done
done
4、while循環
語法結構
while(條件)
do
代碼
done
a=1
while(($a<10))
do echo $a
a=`expr $a + 1`
done
5、until循環
語法結構
until ((條件))
do
代碼
done
i=1
until (( $i > 1 ))
do
echo "i小于1"
done
6、break
1、跳出單個循環
for ((i=0; i < 10; i ++))
do
echo "當前i的值是$i"
if [ $i == 5 ]
then
break
fi
done
2、跳出內部循環
for ((i = 0; i< 10; i++))
do
echo "外層循環i的值$i"
for ((j =0; j<10;j++))
do
echo "內層循環j的值$j"
if [ $j == 5 ]
then
echo "退出內層循環"
break
fi
done
done
3、跳出外部循環(break 數字:表示退出幾層循環)
for ((i = 0; i< 10; i++))
do
echo "外層循環i的值$i"
for ((j =0; j<10;j++))
do
echo "內層循環j的值$j"
if [ $j == 5 ]
then
echo "退出內層循環"
break 2
fi
done
done
7、continue
for ((i=0;i < 5; i++))
do
echo "外層循環i的值$i"
if [ $i == 2]
then
echo "跳出"
continue
fi
done
文件包含
語法一: ./filename
文件A -> fileA.sh
腳本內容
#!/bin/bash
echo "我是文件A"
文件B -> fileB.sh
腳本內容
#!/bin/bash
#文件B包含文件A
source ./fileA.sh
echo "我是文件B"
cat命令
作用
- 查看文件內容,
- 連接文件,
- 創建一個或者多個文件,
- 重定向輸出到終端
- 重定向到文件
語法:
- 查看文件內容 cat test.sh
- 查看內容帶行號 cat -n test.sh
- 查看內容(有內容的行) cat -b test.sh
- 在每一行的后面增加一個美元符($) cat -e test.sh 作用于多行內容轉換為一行內容
- 單獨輸入一個cat時候,接收輸入內容,并輸出內容 退出control+c
獲取用戶輸入
read命令
1、接收一個輸入內容
#寫法一:
echo "請輸入你的名字"
read name
echo "你的名字是${name}"
#寫法二:
read -p "請輸入你的名字" name
echo "你的名字是${name}"
2、超時->輸入的時候,過了多少時間沒有輸入,就過期
if read -t 6 -p "請輸入你的名字" name
then
echo "你的名字是${name}"
else
echo "超時"
fi
3、隱藏輸入內容,相當于輸入密碼 -s
read -s -p "請輸入你的密碼" name
echo "你的密碼是${name}"
4、從文件中讀取內容
cat testA.sh | while read line
do
echo "內容${line}"
done
printf命令使用
1、prindf命令和echo命令的區別
- printf不換行,echo自動換行
- print用于格式打印,echo用于標準輸出
2、printf語法結構
printf format-string 參數列表
#打印輸出表頭
printf "%-10s %-8s %-4s \n" 姓名 性別 體重kg
#打印輸出內容
printf "%-10s %-8s %-4s \n" Andy 男 64kg
printf "%-10s %-8s %-4s \n" jar 男 65kg
printf "%-10s %-8s %-4s \n" 帥牛哥 男 100kg
"%-10"指的是一個寬度為10的字符,"-"表示左對齊
"s"表示字符串字符
"%-4.sf"指的是一個寬度為4,小數點2位,"f"表示小數
3、printf也可以用單引號或者不用
多個參數輸出需要用符號
函數
1、語法結構
function testFunction() {
echo 第一個參數
}
testFunction
輸入/輸出重定向
1、輸入輸出重定向->控制臺/文件
1.1、將file中的內容讀取到控制臺 wc 文件名稱
- 第一個參數:文本行數
- 第二個參數:文本詞數
- 第三個參數:文本字節數
使用cat 來使用輸入重定向
1.2、輸出重定向 “>”:我們把方向指向一份文件,那么將文件中的內容刪除,寫入新的內容
">>"追加
腳本文件fileA.sh代碼
#!/bin/bash
echo "我是文件A"
腳本文件fileB.sh代碼
#!/bin/bash
echo "我是文件B"
echo "Hello Dream" > fileA.sh
echo "追加" >> fileA.sh
執行腳本代碼
./fileB.sh
總結:替換內容->將fileB.sh輸出內容替換了fileA.sh中內容
2、“expr”命令
- 方式一
a=100
b=200
val=`expr $a + $b`
echo "val的值${val}"
- 方式二
a=100
b=200
val=$(expr $a + $b)
echo "val的值是${val}"
- 方式3
a=100
b=200
val=$[ $a + $b ]
echo "val的值是${val}"
3、浮點數
3.1、bash的基本用法
"bc"命令:是在我們的shell腳本語言中中提示符,通過bc命令訪問bash計算器
- 第一步:輸入bc命令打開計算器
- 第二步:開始計算
- 第三步:直接輸入
- quit 退出
將bash計算器應用到shell腳本中
語法結構:val=$(echo "options;expression" | bc)
options:表示選項,可以設置精度
expression:表達式
#案例一:基本語法
val=$(echo "sacal=1;1.56 * 100" | bc)
echo "val的值為:$val"
總結:1.56*100->稱為表達式
sacal=1表示選項
#案例二:
val1=1.314
val2=0.618
val3=$(echo "$val1 * $val2" | bc)
val4=$(echo "$val3 * $val2" | bc)
echo "val4的值是:$val4"
#總結:簡單計算可以,復雜計算麻煩
#案例三:bc命令+輸入重定向
語法格式:
val=$(bc<<FG
iptions
statements
expression
FG
)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
val1=1.314
val2=0.618
val3=$(bc << FG
a = ($val1 * $val2)
b = ($a * $val2)
a + b
FG
)
echo "val3的值是:$val3"
管道
使用場景:有時候我們需要一個命令的輸出作為另一個命令的輸入
語法結構: command1 | command2
4、重定向->外部文件操作
4.1、理解輸入和輸出、錯誤概念:shell腳本語言中將輸入、輸出、錯誤分為 了三種描述符(3中狀態),分別對應的值(0,1,2)
- 第一種:STDIN->標準輸入->0->鍵盤輸入
第一點:直接輸入cat命令->接收鍵盤輸入,然后打印到控制臺
第二點:采用cat接收一個非STDIN文件輸入,說白了就是讀取文件內容,輸出到控制臺 cat fileA.sh - 第二種:STDOUT->標準輸出->1->對應終端顯示
第一點:重定向->輸出文件中,原來輸出到控制到,現在重定向到文件
#ls-l:顯示文件時間信息()
#who:打印當前登錄系統的用戶信息
who >> testB.sh
cat testB.sh
#ni hao
我從不裝逼
zhaoruisheng console Mar 6 13:20
zhaoruisheng ttys000 Mar 6 13:20
第二點:重定向錯誤->輸入到文件中
ls -al a.sh > testB.sh
總結一:到我們的命令發生錯誤時候,shell腳本語言并不會將錯誤信息重定向到輸出重定向文件,shell及時創建了輸出重定向文件,當時也不會寫入內容
總結二:雖然創建了文件,但是文件內容是空的
總結三:shell腳本語言對于錯誤信息處理和普通信息輸出是分開的,那么如果我們希望報錯錯誤信息,那么需要采用STDERR實現
- 第三種:STUERR->標準錯誤-> 2
ls -al a.sh 2> testB.sh
5、重定向錯誤信息
5.1、只定向錯誤
- 將STDERR文件描述改為2 ls -al a.sh 2> testB.sh
- 將STDOUT和STDERROR結合使用
第一步:執行命令
ls -al testA.sh fileA.sh 2> testB.sh
第二步:查看結果
-rwxr-xr-x@ 1 zhaoruisheng staff 74 3 5 16:53 testA.sh
5.2、重定向錯誤和重定向數據 - STDOUT和STDERROR結合使用(1和2),保存錯誤信息和數據,即:在后面追加就行了,可以追加到別的文件
第一步:執行命令ls -al testA.sh fileA.sh 2> testB.sh 1>> testB.sh
第二步:查看數據和錯誤
ls: fileA.sh: No such file or directory
-rwxr-xr-x@ 1 zhaoruisheng staff 74 3 5 16:53 testA.sh - 同時將數據和錯誤信息輸入到同一個文件 “&>”
ls -al testA.sh fileA.sh 2> testB.sh 1&> testB.sh
輸入和輸出
6、重定向輸出->深入一點
6.1、臨時重定向 “&”
案例一:
echo "Hello world" >&2
echo "你好"
案例二:
當執行 ./hello.sh 2> testB.sh后 Hello world 被重定向到testB中了,使用>&2后就會別被標記為錯誤信息, 1位輸出信息
6.2、永久重定向 exec命令
案例一:保存數據
exec 1> testB.sh
echo "Hello world"
echo "你好"
echo "掛卡很快就"
echo "kjhlakjhflha"
案例二:保存錯誤信息和數據
exec 1> fileContent.sh
echo "Hello world"
echo "你好"
echo "JAR童鞋"
exec 2> error.sh
echo "我報錯了" >&2
echo "不好意思,我拒絕你,你不配"
7、重定向輸入
從文件A中讀取內容到文件B中
exec 0< fileContent.sh
count=1
while read line
do
echo "當前行數:$count 讀取內容:$line"
count=$[ $count + 1 ]
done
8、重建自己的重定向
0、1、2是系統提供的,我們可以自定義
- 創建自己的輸出文件描述(創建新的文件或者替換內容)
案例一:創建新的文件或者替換內容
exec 3> fileContent.sh
echo "Hello world"
echo "你好" >&3
echo "JAR童鞋"
exec 2> error.sh
echo "我報錯了" >&2
echo "不好意思,我拒絕你,你不配"
案例二:追加內容
exec 3>> fileContent.sh
echo "Hello world"
echo "你好" >&3
echo "JAR童鞋" >&3
exec 2> error.sh
echo "我報錯了" >&2
echo "不好意思,我拒絕你,你不配"
- 恢復文件原始的描述符
#最開始是3重定向到1
exec 3>&1
exec > fileContent.sh
echo "Hello world"
exec 2> error.sh
echo "我報錯了" >&2
echo "不好意思,我拒絕你,你不配"
exec 1>&3
echo "搞完了"
- 創建文件輸入的描述符
exec 6<&0
exec 0< fileContent.sh
count=1
while read line
do
echo "當前行數:$count 讀取內容:$line"
count=$[ $count + 1 ]
done
#恢復之前文件描述符
exec 0<&6
echo "輸出"
read -p "你是不是一個男人?" isMan
case $isMan in
Y|y) echo "男人" ;;
N|n) echo "女人" ;;
*) echo "人妖" ;;
- 創建讀寫的描述符
exec 3<>fileContent.sh
#從fileContent中讀取文件
read line <&3
echo "Read: $line"
#寫入文件
echo "I have a deam" >&3
注意:替換了第二行?因為我們文件指針讀取完了第一行,文件指針指向了第二行,所以第二行之后所有的內容被替換
- 關閉文件描述符:關閉后,在當前腳本中讀寫都不允許,讀取和寫入都會報錯
語法結構:exec 3>&-
exec 3>fileContent.sh
echo "我是天才">&3
exec 3>&-
echo "寫入鎖定">&3
read line <&3
echo "數據讀取:$line"
- 打開文件描述
lsof命令:非管理員用戶也可以采用這個命令插件系統信息
命令路徑:/uset/sbin/lsof
/usr/sbin/lsof -a -p $$ -d 0,1,2
~~~~~輸出
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 519 zhaoruisheng 0u CHR 16,0 0t4515 665 /dev/ttys000
bash 519 zhaoruisheng 1u CHR 16,0 0t4515 665 /dev/ttys000
bash 519 zhaoruisheng 2u CHR 16,0 0t4515 665 /dev/ttys0000
分析:/usr/sbin/lsof->表示lsof命令
"-a"->表示將兩個選項結果進行(AND操作)拼接(格式化輸出)
"-p"->進程ID
"$$"->表示環境變量
"-d"->表示文件描述符(例如:0、1、2)
分析結果
COMMAND->表示正在運行的命令名稱(取出名字前9個字符)
PID->進程ID
USER->進程所屬登錄名
FD->文件描述符號以及訪問類型(r讀、w寫、u讀寫)
TYPE->表示文件類型(CHR:字符型,BLK塊類型,DIR目錄、REG文件)
DEVICE->設備號
SIZE/OFF->如果存在,那么表示文件大小
NODE->表示本地文件節點號
NAME->表示文件名稱(路徑)
exec 3> fileContent.sh
exec 6> fileB.sh
exec 7< fileErr.sh
/usr/sbin/lsof -a -p $$ -d 0,1,2,3,6,7
~~~~~~執行結果
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2268 zhaoruisheng 0u CHR 16,0 0t5834 665 /dev/ttys000
bash 2268 zhaoruisheng 1u CHR 16,0 0t5834 665 /dev/ttys000
bash 2268 zhaoruisheng 2u CHR 16,0 0t5834 665 /dev/ttys000
bash 2268 zhaoruisheng 3w REG 1,8 0 55364172 /Users/zhaoruisheng/Desktop/Shell/fileContent.sh
bash 2268 zhaoruisheng 6w REG 1,8 0 55378786 /Users/zhaoruisheng/Desktop/Shell/fileB.sh
- 阻止命令輸出 > /dev/null
案例一:
打印命令+ > /dev/null
案例二:清空文件
cat /dev/null > fileContent.sh
- 創建臨時文件
創建本地的臨時文件
案例一:保證當前文件目錄唯一
mktemp nihao.sh
#在腳本中創建臨時文件
#創建臨時文件
tempfile=$(mktemp tempfile.xxxxxxx)
#重定向文件
exec 3> $tempfile
#打印文件名稱
echo "文件名稱 $tempfile"
#給文件輸入內容
echo "我是個臨時文件" >&3
echo "我是個臨時文件1" >&3
echo "我是個臨時文件2" >&3
#關閉文件
exec 3>&-
#打印文件內容
cat $tempfile
#刪除臨時文件
rm -f $tempfile 2> /dev/null
在/temp目錄下創建臨時文件 "-t"
案例一:
mktemp -t testfile.xxxxx
~~~~~執行結果
/var/folders/5c/f1wlx5wn2nv1zl04kg_35prm0000gn/T/testfile.xxxxx.8wF10COI(臨時目錄)
注意:不同系統臨時目錄不一樣
案列二:
#創建臨時目錄
tempfile=$(mktemp -t tempfile.xxxx)
echo "我是一個臨時目錄" > $tempfile
#追加內容
echo "追加內容" >> $tempfile
#打印文件路徑
echo "文件路徑:$tempfile"
cat $tempfile
#刪除文件
rm -f $tempfile 2> /dev/null
創建臨時目錄 "-d"
#當前目錄下創建臨時目錄
tempfile=$(mktemp -d testfile.xxxx)
#進入臨時文件
cd $tempfile
#在臨時目錄中創建臨時文件
tempfile1=$(mktemp testfile.xxxx)
tempfile2=$(mktemp testfile.xxxxx)
#自定義文件描述->重定向輸出
exec 7>$tempfile1
exec 8>$tempfile2
#打印臨時目錄路徑
echo "臨時目錄路徑:$tempfile"
#向臨時文件寫入內容
echo "我是臨時文件1" >&7
echo "我是臨時文件2" >&8
cat $tempfile1
cat $tempfile2
- 記錄消息
作用:將輸出同事發送顯示器和日志文件,重定向的話需要兩次,采用tee命令一次完成
#采用管道,一個命令的輸出作為另一個命令的輸入
案例一:重定向->輸出->覆蓋
date | tee testB.sh
案例二:追加
date | tee -a testB.sh
案例三:應用到腳本中
操作數據庫
導出SQL文件
場景:有一個excel文件,導出.csv文件轉成.sql文件
腳本實現
#!/bin/bash
#定義數據庫文件(.sql)文件
outfile='test.sql'
#定義域分隔符->分割字符串
IFS=','
while read name sex age mv yd phone
do
cat >> $outfile << EOF
INSERT INTO t_test (name, sex, age, mv, yd, phone) VALUES ('$name', '$sex', '$age', '$mv', '$yd', '$phone');
EOF
done < ${1}
執行操作./hello.sh csvtest.csv
分析:
三個重定向操作
- 第一個:輸入重定向done < ${1},{1}第一個參數恰好是一個文件,read通過循環一行行讀取,{2}是第二個參數,同事read還會通過IFS進行字符串分割,分割之后自動給參數賦值
- 第二個:輸出重定向
cat >> test.sql:等到輸入內容,敲回車后輸出到制定重定向文件 - 第三個:輸入重定向'<<'追加
數據庫操作
- 鏈接數據庫->登錄數據庫