shell_script1

来源:http://www.cnblogs.com/george-guo/archive/2017/06/29/7096241.html
-Advertisement-
Play Games

1、簡介 2、read 3、運算工具 4、if/then結構 5、while迴圈 6、for迴圈 一、簡介 1、什麼是shell shell是用戶與系統交互作用的界面。shell是一種命令解釋程式,同時也是一種高級程式設計語言 2、shell常見種類 Bourne Shell(/usr/bin/sh ...


1、簡介 2、read 3、運算工具 4、if/then結構 5、while迴圈 6、for迴圈   一、簡介 1、什麼是shell shell是用戶與系統交互作用的界面。shell是一種命令解釋程式,同時也是一種高級程式設計語言 2、shell常見種類 Bourne Shell(/usr/bin/sh或/bin/sh) Bourne Again Shell(/bin/bash) C Shell(/usr/bin/csh) K Shell(/usr/bin/ksh) Shell for Root(/sbin/sh) 其中:Bash在日常工作中被廣泛使用;同時,Bash也是大多數Linux系統預設的Shell; 3、shell局限性 1.1、需要耗費大量資源的任務,特別是對執行速度要求較高的場合 1.2、涉及大量的數學計算 1.3.、關鍵性應用(資料庫,網站等) 1.4.、設計圖形或者GUI的應用 1.5.、需要直接訪問硬體 1.6.、開發閉源的應用(相對於開源) 4、基礎 文件系統:Linux 的文件系統是一個包含了目錄和文件的分層的組織結構,位於最頂端的叫做根目錄(root directory),用斜杠/ 來表示 目錄: 是一種包含目錄項的文件,每個目錄項中都包含了文件名 文件名: 目錄的內容稱為目錄項,目錄項包含了文件名,只有兩種字元不允許出現在文件名中:斜杠,空字元(ASCII 值為0),斜杠用於分隔路徑中的文件名,空字元用來表示路徑的結尾。文件名的長度通常可以達到255個字元 路徑: 一系列文件名連起來,用斜杠分隔,就叫做路徑,路徑用於表示文件的位置;以斜杠開頭的路徑叫做絕對路徑,否則為相對路徑,相對路徑相對於當前工作目錄 返回碼:所有命令都有一個返回值,用0-255之間的整數來表示;腳本就是一個命令,它也有返回值,另外,腳本裡面的函數也有返回值 退出腳本的正規方法是明確地用命令exit [code]來退出,如:exit 0;exit $?   二、read 1、定義 read是一個buildin命令,主要完成對參數的賦值,類似C語言中的scanf; 其不僅可以賦值變數,還可以賦值數組; 其輸入不僅是屏幕,還可以是文件描述符 2、實操 # read a --輸入字元串,將字元串賦值給變數 a;# echo $a hello world!! # read name sex age --同時分別給三個變數賦值,輸入分隔符預設為 空格符 zhangsan male 50 # unset name sex age --刪除變數 # IFS=';' --將 read 的輸入分隔符改為 ';' # vim test.sh #!/bin/bash prompt="Please enter your name:" read -p "$prompt" name echo "Greetings $name"   三、運算工具 1、簡單數學運算 # echo $((1+2**2-3*4/5%6)) --輸出計算結果到屏幕 # a=$((1+2**2-3*4/5%6)) --把計算結果賦給變數a # ((a=1+2**2-3*4/5%6)) --同上 # echo "scale=3;10/3" | bc --bc計算器;保留小數點後三位 # echo "2^10" | bc --bc計算器;計算2的10次方 # awk 'BEGIN{print 1/3}' --awk計算 2、獲取隨機數 # od -N4 -tu4 /dev/urandom | sed -n '1s/.* //p' --獲取一個7位數的號碼 # od -Ad -w24 -tu4 /dev/urandom --獲取隨機數 # od -tu8 /dev/urandom --獲取隨機數 # od -tu8 /dev/urandom | sed -r 's/^[0-9]+\s+//' | sed -r 's/\s+/\n/g' |cut -b1-8 |sed -r -n '/^.{8}$/p' | sed 's/^/186/' |head -n5000 |vi - --獲取一萬個電話號碼 # od -N40000 -tu4 /dev/urandom | sed -r 's/^[0-9]+(\s+)?//' | sed -r 's/\s+/\n/g' | grep -vE '^\s*$' > 10k_random --生成一萬個隨機數 # sed -r -n '/^.{8}$/p' 10k_random | head -n 100000 | sed 's/^/186/' > phone_num 3、獲取數字序列 # seq 10 --獲取1到10 # seq 1 2 10 --獲取1到10,步長為2 # seq 10 100 --獲取10到100 # seq 10 -1 1 --倒序,10到1   四、if/then實例 1、判斷字元 "a" 是否等於 "A" # vim test.sh #!/bin/bash if [[ "a" = "A" ]]; then if [ "a" = "A" ]; then   echo "a equals A" else   echo "a no equals A" fi 2、判斷/root/test/test.sh是否存在並具有可執行許可權 # vim test.sh #!/bin/bash if test -x /root/test/test.sh;then   echo "/root/test/test.sh is executable" fi 3、判斷系統是否存在 root 用戶 # vim test.sh #!/bin/bash if grep -E --color=auto ^root: /etc/passwd; then   echo "user root exists" fi 4、判斷文件類型 # vim test.sh #!/bin/bash function isSymbolicLink() {   file=$1   flag=$(ls -ld $file | cut -b1)   test "$flag" = "1"   return $? } file=$1 if isSymbolicLink $file; then   echo "Symbolic Link" elif test -d $file; then   echo "Directory file" elif test -f $file; then   echo "Regular file" elif test -b $file; then   echo "Block special" elif test -c $file; then   echo "Character special" elif test -p $file; then   echo "Named pipe" elif test -S $file; then   echo "Socket" else   echo "Unkown" fi 5、判斷輸入數字的大小 # vim test.sh #!/bin/bash num=$1 if test "$num" -lt 10 ;then   echo "小數字" elif test "$num" -lt 20;then   echo "中數字" elif test "$num" -lt 30;then   echo "大數字" else   echo "超大數字" fi 6、從標準輸入獲取一個數字,並根據其大小輸出指定字元串 # vim test.sh #!/bin/bash echo -n "Enter a number: " read num if [ "$num" -lt 100 ]; then echo "小於100" elif [ "$num" -ge 100 -a "$num" -lt 200 ]; then echo "大於等於100小於200" elif [ "$num" -ge 200 -a "$num" -lt 300 ]; then echo "大於等於200小於300" else echo "其它數字" fi   五、wihle迴圈 1、認識 測試 while 關鍵字後面一條命令的返回碼,條件為真時,程式讀入while迴圈體中的指令;0為真。迴圈體如下: while [] --while 後面運行 [ ] 命令,測試 [ ] 命令的返回碼 cat /filename | while read line       --while 後面運行read 命令,測試 read 命令的返回碼 do ...... done 2、迴圈控制語句 continue --終止當前迴圈,開始下一個迴圈 break --終止當前迴圈,並退出迴圈體 exit --終止當前腳本 3、實例 # vim test.sh --區分 continue 與 break 的區別 #!/bin/bash while true do sleep 1 echo test continue/break echo done # vim test.sh --區分 break 與 exit 的區別 #!/bin/bash while test -e /data/test/test.sh do echo "exists" sleep 1 break/exit done echo "loop end" # vim test.sh --尋找我們給定的路徑,直到尋到為止 #!/bin/bash if test $# -ne 1;then echo "wrong paraneter" >&2 exit fi path=$1 while test ! -e "$path" do sleep 1 echo "don't found!!!" done echo "found" # vim test.sh --腳本運行指定的時間,時間一到就退出;單位為 s #!/bin/bash if test $# -ne 1;then echo "Usage: $(basename $0) TIME" >&2 exit 1 fi timeLength=$1 beginTime=$(date +%s) endTime=$(( $beginTime + $timeLength )) --------------------------------------------------------- while test $(date +%s) -lt "$endTime" do echo "processing....." sleep 1 done --------------------------------------------------------- while true do if test $(date +%s) -ge "$endTime";then break fi echo "processing....." sleep 1 done --------------------------------------------------------- echo "time out" # vim test.sh --迴圈讀取文件的每一行,並計算每行的字元個數 #!/bin/bash file=$1 --------------------------------------------------------- totalLines=$(wc -l < $file) line=1 while test $line -le $totalLines do lineData=$(sed -n "${line}p" $file) len=$(echo -n $lineData | wc -c) echo "line ${line}: $len" line=$(( $line + 1 )) done --------------------------------------------------------- line=1 while read lineData do len=$(echo $lineData | wc -c) echo "line ${line}: $len" line=$(( $line + 1 )) done < $file --------------------------------------------------------- # vim test.sh -- 列印出10行hello world;<(seq 10)相當於一個文件路徑;稱之為進程置換 #!/bin/bash while read num do echo "hello world" done < <(seq 10) --------------------------------------------------------- n=1 while [ $n -le 10 ] do echo "hello world" n=$((n+1)) done --------------------------------------------------------- # vim test.sh --創建一個不盡的迴圈,要求迴圈運行1分鐘後自動終止 #!/bin/bash start_time=$(date +%s) while true do cur_time=$(date +%s) test $((cur_time - start_time)) -ge 10 && break time=$((cur_time - start_time)) echo "time is $time......" sleep 1 done # vim test.sh --先用while 迴圈創建100個.txt文件;再將所有文件尾碼名改為 .html #!/bin/bash count=100 --------------------------------------------------------- seq $count | while read i do touch ${i}.txt done ls -1 *.txt | while read oldname do newname=$(echo $oldname | sed 's/.txt$/.html/') mv $oldname $newname done --------------------------------------------------------- while read i do touch ${i}.txt done < <( seq $count ) while read oldname do newname=$(echo $oldname | sed 's/.txt$/.html/') mv $oldname $newname done < <(ls -1 *.txt ) # vim test.sh --計算出1000 之內的偶數的和;不能使用管道,因為管道會生成子進程 #!/bin/bash sum=0 while read num do sum=$(( $sum + $num )) done < <(seq 2 2 998) echo "sum: $sum " # vim test.sh --批量添加100個郵件用戶,用戶名為u1 至u100,密碼為abc,登錄shell 為/sbin/nologin,只屬於email組 #!/bin/bash password=abc group=email grep -Eq "^${group}:" /etc/group || groupadd $group while read i do useradd u${i} -N -g $group -s /sbin/nologin passwd u${i} --stdin <<< "$password" done < <(seq 100) # vim test.sh --批量刪除剛剛創建的100個郵件用戶 #!/bin/bash while read i do userdel -r u${i} done < <(seq 100   六、for 迴圈 在一系列由分隔符隔開的字元串中,按順序每次取其中之一,當取完之後,迴圈結束 每次取出的字元串會被保存在一個變數中,可以在迴圈體內使用該變數 由分隔符隔開的字元串可以通過以下方法提供: 1、手動輸入字元串,用於迴圈指定次數 # vim test.sh #!/bin/bash for i in 1 2 3 do echo $i don 2、由變數提供字元串 # vim test.sh #!/bin/bash FILES="/bin/bash /bin/ls /bin/cat" for file in $FILES do echo $file done 3、程式生成的字元串 # vim test.sh #!/bin/bash for n in $(seq 11) do   echo $n done 4、由shell 展開而生成,迴圈目錄中的文件 # vim test.sh #!/bin/bash for f in /etc/init.d/* do echo $f done # vim test.sh 5、列印出/dev 下麵所有以 loop 開頭的文件的文件名 # vim test.sh #!/bin/bash for file in /dev/loop* do echo $(basename $file) done 6、計算出1000 之內的偶數的和 # vim test.sh #!/bin/bash sum=0 for number in $(seq 2 2 998) do   sum=$(( $sum + $number )) done echo "total: $sum" 7、批量添加100個郵件用戶,用戶名為u1 至u10,密碼為abc,登錄shell 為/sbin/nologin,只屬於email組 # vim test.sh #!/bin/bash function checkGid() { gid=$1 if ! grep -qE "^$gid:" /etc/group; then groupadd $gid fi } function isRoot() { id=$(id | awk -F "[=(]" '{print $2}') if test "$id" -ne 0; then echo "must be root" >&2 exit 1 fi } count=10 namePrefix=u password=abc shell=/sbin/nologin gid=email isRoot checkGid $gid for num in $(seq $count) do name=${namePrefix}${num} useradd $name -s $shell -g $gid &> /dev/null if test $? -ne 0; then echo "failed to create $name" >&2 else echo "created successfully -- $name" echo "$password" | passwd --stdin $name &> /dev/null if test $? -ne 0; then echo "failed to change password for $name" >&2 else echo "password changed successfully -- $name" fi fi done 8、獲取區域網內所有電腦的IP 和MAC 地址的對應表 # vim test.sh #!/bin/bash ipPrefix=192.168.1. startIp=1 endIp=254 for num in $(seq $startIp $endIp) do ip=${ipPrefix}$num ping -W1 -c1 $ip &>/dev/null & done wait arp -n | sed '/incomplete/d' | awk '{print $1,$3}'| cat | sort -n -t '.' -k4,4 | column -t 9、列印出九九乘法表 # vim test.sh #!/bin/bash for row in $(seq 9) do for col in $(seq $row) do echo -n "${col}x${row}=$(( $col * $row )) " done echo done | column -t 10、簡陋計算器 #!/bin/bash varnum=3 if test "$#" -ne "$varnum"; then echo "wrong argument" >&2 exit 1 fi num1=$1 num2=$3 operator=$2 if test "$operator" = "x";then operator="*" fi if test "$operator" = "/" -a "$num2" = 0; then echo "division by 0" >& 2 exit 1 fi result=$(( $num1 $operator $num2 )) echo "$result" 註意:乘法的處理;被除數為0時的處理 11、把指定目錄下的某些文件複製到指定的目錄,要求: #1. 從命令行參數接收兩個參數,分別是源目錄和目標目錄 #2. 如果源目錄不存在,應該報錯 #3. 如果目標目錄不存在,就創建一個 #4. 如果目標已經存在但不是目錄,就報錯 #5. 只複製常規文件,軟鏈接文件 #6. 對於常規文件,只複製大小小於1M 的文件 # vim /test.sh #!/bin/bash function displayHelp() { echo "Usage: $(basename $0) SRCDIR DSTDIR" } function getSize() { file=$1 size=$(ls -l $file | awk '{print $5}') echo $size } if test $# -ne 2; then displayHelp >&2 exit 1 fi srcdir=$1 dstdir=$2 if test ! -d "$srcdir"; then echo "$srcdir not exists or is not a directory" >&2 exit 1 fi if test ! -e "$dstdir"; then mkdir "$dstdir" fi if test ! -d "$dstdir"; then echo "$dstdir is not a directory" >&2 exit 1 fi for file in $srcdir/* do if test -L $file; then cp -a $file $dstdir/ elif test -f $file; then --------------------------------------------------- size=$(getSize $file) if test "$size" -lt 1048576; then cp -a $file $dstdir/ fi --------------------------------------------------- find $file -type f -size -1024k -exec cp -a {} $dstdir/ \; --------------------------------------------------- fi done
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Oracle 11g中,Oracle 增加了2個查詢:pivot(行轉列) 和unpivot(列轉行) pivot(聚合函數 for 列名 in(類型)) ,其中 in('') 中可以指定別名,in中還可以指定子查詢 行轉列: select * from rhsa_gcfx_result orde ...
  • 1、明確技術與業務的關係 (1)知識和發明來自實踐和生產的實際需要,OSI的7層模型再美、再學院化也沒有乾過TCP/IP; (2)切莫強求技術驅動,技術職責第一要務是做好深度服務業務; (3)數據產品不同於一般業務系統。隔行如隔山,跨部門項目往往對雙方團隊的時間管理、利益妥協、溝通協作和交付提出了很 ...
  • 資料庫的創建和刪除 黑視窗啟動資料庫服務:net start mysql 關閉資料庫服務:net stop mysql 創建資料庫使用關鍵字create database格式: create database 資料庫名; create database 資料庫名 character set 字元集; ...
  • oracle查詢重覆數據 select * from 表 where 條件 and 判重欄位 not in (select 判重欄位 from 表 where 條件 group by 判重欄位 having count(*) > 1) 根據rowid刪除重覆數據,保留一條 delete from 表 ...
  • oracle數值函數 abs()、 ceil()、 oracle數值函數 abs()、 ceil()、 1、格式:abs(number) 即 abs(數值) 返回數值的絕對值。 例: abs(5) 返回 5 abs(-5) 返回 5 2、格式:ceil(number) 即 ceil(數值) 根據輸入 ...
  • 包括初始化root用戶密碼password的過程以及兩個常見問題的解決方法 1. 下載MySQL zip包 進入 "MySQL官網" 按需選擇zip包下載並解壓, 比如現在我電腦裡面下載的是mysql 5.7.17 winx64 http://dev.mysql.com/downloads/mysq ...
  • 資料庫引擎接收到一個新的查詢請求(Batch或SP),查詢優化器會生成執行計劃,並緩存到記憶體中;下次再次執行相同的查詢請求時,資料庫引擎從復用已經緩存的執行計劃,換句話,資料庫引擎為每一個查詢請求生成執行計劃,並把已經生成的執行計劃緩存起來,當接收到相同的查詢請求時,資料庫引擎復用已緩存的執行計劃。 ...
  • Linux系統出現了性能問題,一般我們可以通過top、iostat、free、vmstat等命令來查看初步定位問題。在一個以前看到系統監控工具,總在想那些監控工具的代理,如何收集系統性能信息,io性能,cpu使用,帶寬使用等信息,偶然發現,不同系統均提供有性能分析工具的,代理可通過這些命令獲取系統性 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...