這幾天也是剛學習了shell腳本的編寫,雖然他不像Python、Java那樣可以編寫很大型的項目(固然我是這麼認爲),可是在操控Linux系統方面,仍是有獨特的優點的,固然在學習過程當中咱們也能更好的瞭解Linux。接下來,就開始學習吧。後面會有幾個小例子,固然都是別的地方挪過來的,我就是代碼的搬運工,嘿嘿。喜歡學習的同志們能夠點擊Python聚焦專欄,查看更多知識。html
在通常狀況下,人們並不區分 Bourne Shell 和 Bourne Again Shell,因此,像 #!/bin/sh,它一樣也能夠改成 #!/bin/bash。python
#!/bin/bash
chmod +x ./test.sh # 修改權限 ./test.sh # 執行
運行時必定要寫成./test.sh,由於直接寫test.sh,linux會去PATH裏尋找,而通常只有/bin,/sbin,/usr/bin,/usr/sbin等在PATH中,因此使用./test.sh告訴系統,就在本目錄下找mysql
/bin/sh test.sh
定義方式和python相似,只不過定義過程當中不容許使用空格,默認都是字符串類型linux
declare命令定義有類型的變量nginx
語法 | 說明 |
---|---|
${var_name#規則} | 從變量開頭進行匹配,將符合最短的數據刪除 |
${var_name##規則} | 從變量開頭進行匹配,將符合最長的數據刪除 |
${var_name%規則} | 從變量末尾進行匹配,將符合最短的數據刪除 |
${var_name%%規則} | 從變量末尾進行匹配,將符合最長的數據刪除 |
${變量名/舊字符串/新字符串} | 變量內容符合舊字符串,就將第一個替換 |
${變量名//舊字符串/新字符串} | 變量內容符合舊字符串,就所有替換 |
Shell字符串正則表達式
在進行拼接的時候是能夠出現如下形式的:sql
求長度shell
求字串索引數據庫
expr index $str substr_regsegmentfault
匹配的字串的長度
截取
定義:
讀取:
獲取長度:
多行:
定義
返回值
局部變量
函數庫
$* / $@:以一個單字符串顯示全部向腳本傳遞的參數。
一個變量是否爲0, [ $var -eq 0 ]
包含echo `expr 2 + 2` # 輸出4
浮點數計算:bc
read命令
read -p "請輸入一段文字:" -n 6 -t 5 -s password
echo
printf
printf "%s" jim
test:通常用於替換中括號
test $num = $num2
if . . . else
if condition then command1 elif condition1 then command2 else commandN fi
for . . . in
for var in data do command1 done
while
while condition do command done
死循環
while : do command done # 使用true while true do command done # 使用for for (( ; ; ))
case
case value in value1) command1 ;; value2) command2 ;; *) command2 ;; esac
# 語法格式: sed [option] "pattern command" file_name # 刪除文件第一行 sed -i '1d' file_name
option選項
pattern
command
反向引用
在使用替換字符的時候,修改內容使用&表示使用被替換的條件
# 在匹配到^la..jim的後面加shuai # &:全匹配,\1:其使用了正則的分組,因此前面須要使用小括號括起來 sed -i 's/^la..jim/&shuai/g' sed.txt
# 語法格式: awk 'BEGIN{}pattern{commands}END{}' file_name
for user in `cat /etc/passwd | cut -d ":" -f 1` do echo "$user" done
nginx_num_process=$(ps -ef | grep nginx | grep -v grep | wc -l) if [ nginx_num_process -eq 0 ];then systemctl start nginx fi
while true do read -p "pls input a positive number: " num expr $num + 1 &> /dev/null if [ $? -eq 0 ];then if [ `expr $num \> 0` -eq 1 ];then for((i=1;i<=$num;i++)) do sum=`expr $sum + $i` done echo "1+2+3+....+$num = $sum" exit fi fi echo "error,input enlegal" continue done
this_pid=$$ while true do ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null if [ $? -eq 0 ];then echo "Nginx is running well" sleep 3 else systemctl start nginx echo "Nginx is down,Start it...." fi done
FILE_NAME=/root/lesson/5.6/my.cnf function get_all_segments { echo "`sed -n '/\[.*\]/p' $FILE_NAME | sed -e 's/\[//g' -e 's/\]//g'`" } function count_items_in_segment { items=`sed -n '/\['$1'\]/,/\[.*\]/p' $FILE_NAME | grep -v "^#" | grep -v "^$" | grep -v "\[.*\]"` index=0 for item in $items do index=`expr $index + 1` done echo $index } number=0 for segment in `get_all_segments` do number=`expr $number + 1` items_count=`count_items_in_segment $segment` echo "$number: $segment $items_count" done
sed -i '/[:blank:]*#/^$/d' config.cnf
sed -i 's/^[^#]/\*&/g' config.cnf
user="" password="" host="" mysql_conn="mysql -u"$user" -p"$password" -h"$host"" IFS=":" # 內置分隔符變量 cat data.txt | while read id name birth sex do $mysql_conn -e "insert into school values('$id','$name','$birth','$sex')" done
ftp -inv << EOF open ftp_ip_addr user user_name password put file_name bye EOF #必須頂格寫
根據其餘表的結構建立新表
mysqldumps備份mysql