shell基礎:mysql
sh命令:
參數:
-c string 將string看成命令來執行。注意區別:string是用單引號擴起來的還上用雙引號擴起來的!
-x xxx.sh 開啓調試模式,shell在執行腳本的過程當中把它實際執行的命令都顯示出來,而且在命令的行首顯示一個"+"號(shell內置變量PS4='+ '),同set -x。
補充:能夠經過修改$PS4的值,從而使每一條實際執行的命令前面顯示其行號以及所屬的函數名。eg:先執行export PS4='+{$LINENO:${FUNCNAME[0]}} ', 而後再使用「-x」選項來執行腳本。
-n 不執行腳本,而是去讀一遍腳本中的命令,目的是爲了檢查腳本中的語法錯誤。linux
# !/usr/bin/env bash
說明:腳本解釋器在linux中可能被安裝在不一樣的目錄,而env能夠在系統的PATH目錄中查找,故腳本用env啓動。sql
命令 -/+參數
-參數 設置某個參數
+參數 取消某個參數的設置。 shell
set命令:
參數:
無參 列出全部的環境變量。
-e 當命令的返回值不等於0(即執行該命令報錯)時,當即退出shell。
+e 表示取消-e參數,即當命令的返回值不等於0時,不會當即退出shell,而是會繼續執行shell腳本。
-x 開啓調試模式。數據庫
declare命令:
說明:用於聲明shell變量
參數:
-r 將變量聲明爲只讀變量。eg:declare -r name=jack
-x 將變量設置爲環境變量,該變量可供shell之外的程序來使用。數組
echo命令:
參數:
-e 將特殊字符進行轉義。
\a 發出警告聲
\c 最後不加換行符號
\f 換行但光標仍舊停留在原來的位置
\n 換行且光標移至行首
\r 光標移至行首,但不換行
\t 插入tabbash
let命令:
說明:let命令是bash中用於計算的工具,用於執行一個或多個表達式,變量計算中不須要加上$來表示變量。若是表達式中包含了空格或其餘特殊字符,則必須引發來。
舉例:
let i=i+1
let i++函數
mail命令:
方式一:
在shell窗口中編輯內容,編輯完成後按ctrl+d退出編輯環境,郵件便可發送。
mail -s "郵件主題" jxn@speed.com工具
方式二:
mail -s "郵件主題" jxn@speed.com < content.txtthis
方式三:
cat "mail content" | mail -s "郵件主題" jxn@speed.com
補充:
ctrl+c 終止當前任務命令或程序。
ctrl+d 退出當前用戶環境,至關於exit。
命令行參數
$0 腳本的名字
$1, $2, ..., $9 腳本第1個到第9個命令行參數
$# 命令行參數的個數
$* 以「參數1 參數2 參數3..」 的形式返回全部命令行參數的值
$@ 以「參數1」「參數2」「參數3」.. 的形式返回全部命令行參數的值
$? 最後一條命令的退出狀態碼(執行成功返回0,執行失敗返回1)
$$ 正在執行的進程的ID(PID)
getopts命令:
概念:獲取命令行的參數。
格式:getopts argString varName
說明:
1)參數後面加冒號表示該參數能夠接受賦值。
2)若argString以冒號開頭,則表示忽略錯誤。eg:
若argString爲 a: 那麼,a必須賦值,不然會報錯。
若argString爲 :a: 那麼,a即便不賦值,也不會報錯。
使用:
while getopts :i:na: opt
do
case ${opt} in
i) echo 'this is param i value '$OPTARG
;;
n) echo 'has param n'
;;
a) echo 'this is param a value '$OPTARG
;;
esac
done
# 驗證:sh my.sh -i 99 -n -a asdf
變量:
引用變量:
${variable}
$variable
清除變量:
unset variable
變量替換
$variable 保存在variable中的值
${variable} 保存在variable中的值
${variable:-string} 若是variable的值非空,則值爲variable,不然值爲string
${variable:+string} 若是variable的值非空,則值爲string,不然值爲空
${variable:=string} 若是variable的值非空,則值爲variable,不然值爲string且variable的值設置爲string
${variable:?string} 若是variable的值非空,則值爲variable,不然顯示string並退出
引號的說明【重要】:
單引號括起來的的字符都做爲普通字符對待。
雙引號括起來的字符,除$、\、'(單引號)、"(雙引號)以外,其他字符做爲普通字符對待。
反引號括起來的字串被shell解釋成命令,在執行時,shell首先執行該命令,並以它的標準輸出結果取代整個反引號部分。
將命令的執行結果賦值給變量:
# 將某個shell命令的執行結果賦給某個變量。注:賦值號「=」的左右兩邊不能直接跟空格,不然shell會將其視爲命令。
variableName=`command`
variableName=$(command)
定義系統提示符的變量
eg:PS1='[\u@\t \w]\$ '
\u:顯示當前用戶名
\h:顯示簡寫主機名。如默認主機名「localhost」
\$:提示符。若是是root用戶會顯示提示符爲「#」,若是是普通用戶會顯示提示符爲「$」
\w:顯示當前所在目錄的完整名稱
\W:顯示當前所在目錄的最後一個目錄
\t:顯示24小時制時間,格式爲「HH:MM:SS」
\T:顯示12小時制時間,格式爲「HH:MM:SS」
\d:顯示日期,格式爲「星期 月 日」
\A:顯示24小時制時間,格式爲「HH:MM」
\#:執行的第幾個命令
字符串函數:
${#str} 獲取字符串的長度
${str:num1:num2} 表示從字符串的第num1個字符開始,截取num2個字符。
${str/str1/str2} 將第一個str1替換爲str2
${str//str1/str2} 將全部的str1替換爲str2
${str#*pattern} 刪掉第一個pattern及其左邊的字符串
${str##*pattern} 刪掉最後一個pattern及其左邊的字符串
${str%pattern*} 刪掉最後一個pattern及其右邊的字符串
${str%%pattern*} 刪掉第一個pattern及其右邊的字符串
說明:#是去掉左邊,%是去掉右邊(tip:鍵盤上#在%的左邊)、單一符號是最小匹配,兩個符號是最大匹配。
數組:
定義:shell中的數組用括號來表示,元素之間用空格分隔。
初始化:
方式一:myArray=(element1 element2 element3)
方式二:
myArray[0]=element1;
myArray[1]=element2;
myArray[2]=element3;
獲取數組的元素:
${myArray[index]} 獲取下標爲index的數組
${myArray} 或 ${myArray[0]} 獲取數組的第一個元素
${myArray[*]} 或 ${myArray[@]} 獲取數組的全部元素
${#myArray[*]} 獲取數組的長度
條件判斷:
概念:表達式用中括號[]或雙中括號[[]]括住,條件表達式與左右方括號之間必須都保留一個空格。
說明:單中括號中的變量必需要加雙引號,雙中括號中的變量不用加雙引號。
舉例:[ -z "$pid" ] VS [[ -z $pid ]]
參數:
邏輯運算符:
&& expr1 && expr2 邏輯與(短路與)
|| expr1 || expr2 邏輯或(短路或)
! 邏輯非
數值判斷:
-eq num1 -eq num2 是否相等
-ne num1 -ne num2 是否不相等
-gt num1 -gt num2 是否大於
-ge num1 -ge num2 是否大於等於
-lt num1 -lt num2 是否小於
-le num1 -le num2 是否小於等於
字符串判斷:
= str1 = str2 字符串是否相等
!= str1 != str2 字符串是否不等
-n -n str1 字符串是否非空
-z -z str2 字符串是不是空串(長度是否等於0 z:zero)
文件判斷:
-e -e filenaem 文件是否存在
-r -r filename 文件是否存在且可讀
-w -w filename 文件是否存在且可寫
-s -s filename 文件是否存在且長度非0
-f -f filename 文件是否存在且是普通文件
-d -d filename 文件是否存在且是一個目錄
-L -L finename 文件是否存在且是一個連接
循環:
格式:
while [ condition ]
do
# do something
done
無限循環:
while :
do
# do something
done
讀文件:
# 方式一:read經過輸入重定向,把file的第一行全部的內容賦值給變量line,循環體內的命令通常包含對變量line的處理;而後循環處理file的第二行、第三行。。。一直到file的最後一行
while read line
do
# do something
done < file
# 方式二:command命令的輸出做爲read循環的輸入,這種結構經常使用於處理超過一行的輸出。
command | while read line
do
# do something
done
舉例1:
#!/usr/bin/env bash
# 從數據庫中導出的數據,每行數據以製表符分隔
path=/home/jxn/updateData.tsv
# 計數
count=0;
echo "--------- start"
# 按行讀取文件的內容
while read line
do
# 將每行的內容轉換爲數組
dataArray=(${line});
firstFieldValue=${dataArray[0]};
secondFieldValue=${dataArray[1]};
updatesql="update mytable set firstField=\"${firstFieldValue}\" where secondField=\"${secondFieldValue}\"";
# 執行sql
echo sql=${updatesql};
result=`/home/jxn/tools/mysql -h myhost -P 3306 -uroot -p'root!@#' dbName -e "${updatesql}"`;
# 計數 let count=count+1; echo "---------result=[${result}] count=[${count}] " done < ${path} echo "--------- end"