Shell腳本語言(語法)

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)
    1. $# 表示參數的個數
      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:等到輸入內容,敲回車后輸出到制定重定向文件
  • 第三個:輸入重定向'<<'追加

數據庫操作

  • 鏈接數據庫->登錄數據庫
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370