<<Shell 腳本學習指南>>(Classic Shell Scripting) Shell - 命令解析器 // ------------------------------------------ 1, 位於第一行的 #!, 告知 *nix 以哪個 shell 來執行所指定的 shell 腳本,可以加上選項。 #! /bin/sh - // 選項 - 表示沒有 shell 選項 2, shell 的基本元素 命令與參數 命令名稱是命令行的第一個項目,後面通常會跟着選項,任何額外的參數都會放在選項之後;選項開頭是一個 -,後面跟着一個字母 兩個 -(--)表示選項的結尾 // 變量 var_name=helloworld # 中間不能有任何的空格 var_name_2="hello world" # 因爲 UNIX 以空白(space 或 tab)隔開命令行中各個組成部分 3, 特殊文件: /dev/null /dev/tty /dev/null 傳送到此文件的數據都會被系統丟掉;讀取該文件時會立即返回文件結束符號(end-of-file) /dev/tty 當程序打開此文件時,UNIX 會自動將它重定向到一個終端 4, 訪問 Shell 腳本參數 位置參數: $1, $2, ..., $9, ${10}, ${11}, ... 5, 執行追蹤 sh -x ./test.sh 也可以在 shell 腳本使用 set -x 命令打開執行跟蹤; set +x 關閉 ------------------------------------------ 1, 大部分簡易程序都是處理輸入數據的行,像 grep 與 egrep 及 sed 大部分的工作(90%) 2, 在文本文件中,一行表示一條記錄。 3, 字段分割: i. 使用空白(space 或 tab) ii. 使用特定的定界符 // 使用空白分割時,通常多個連續出現的空格或製表字符都將看到作一個定界符; // 若使用特殊字符分割,則每個定界符都隔開一個字段
1, export 將變量放進環境裏。環境是一個名稱與值的簡單列表,可空所有執行中的程序使用。新的進程會從其父進程繼承環境,也可以在建立新的進程之前修改它 export -p 可用於顯示當前的環境 2, env 可臨時的改變環境變量值 env -i PATH=$PATH HOME=$HOME awk '...' file1 file2 -i 使用來初始化環境變量的; 3, unset 可從執行中的 shell 中刪除變量與函數,默認刪除變量 unset -v first middle last unset -f my_func 4, 參數展開 ${varname:-word} varname 存在且非 null,返回其值;否則返回 word ${varname:=word} varname 存在且非 null,返回其值;否則設置它爲 word,並返回 word ${varname:?message} varname 存在且非 null,返回其值;否則顯示 message ${varname:+word} varname 存在且非 null,返回 word;否則返回 null # 以上所有都可去掉 : ,則 "存在且非 null" 改爲 "存在" 5, 模式匹配 ${variable#pattern} ${variable##pattern} ${variable%pattern} ${variable%%pattern} 6, 位置參數 $# $* $@ "$*" "$@" 7, 特殊變量 $# $@ $* $- $? $$ $0 $! $ENV $HOME $IFS $PATH $PPID $PS1 $PS2 $PWD 8, 算術展開 $((4>3)) 值爲 1 count=4 $((count++)) # $count 爲 5 9, test 命令 test 命令的另一種形式是 [ ... ] ---- if test -f ./file then echo ./file does exist else echo ./file does not exist fi -- [ ... ] 形式 if [ -f ./file ] # 注意: [ ... ] 方括號必須與其中的表達式一空格隔開 then echo ./file does exist else echo ./file does not exist fi ---- 10, break 和 continue 可以接受可選的數值參數 11, shift 處理命令行參數,一次向左位移一位;可以接受一個可選的參數,表示移動的位數
許多 Unix 程序都遵循 標準輸入/輸出(Standard I/O) 的設計原則,它的構想是:程序應有一個數據來源,數據出口,以及報告錯誤的地方;分別叫做標準輸入(Standard input),標準輸出(Standard output)和標準錯誤輸出(Standard error)。程序默認情況下會讀取標準輸入,寫入標準輸出,並將錯誤信息傳遞給標準錯誤。默認的標準輸入,標準輸出及標準錯誤輸出都是終端,當登錄時,Unix 便將默認的標準輸入,標準輸出,標準錯誤安排爲終端。 一般情況下,當程序運行時,它會自動打開這三個文件。I/O 從定向就是通過與終端交互,或是在 shell 腳本里設置,重新安排從哪裏輸入或輸出到哪裏。 // shell 是命令解析器,命令是 shell 的基本元素。shell 在執行 shell 腳本的命令時要識別每個單獨的命令然後在 PATH 裏尋找該命令執行,因此一個命令一般是佔一行;一些符號可以用來分割命令,像 ; | & && || 1, read 讀取行。 read -r variable ... # 將信息讀入一個或多個 shell 變量 2, set -C # 禁止從定向覆蓋 3, <> 打開一個文件作爲輸入與輸出只用 # 在很多環境下,他的運行會有問題 4, 文件描述符- Unix 以一個小的整數數字表示每個進程的打開文件 文件描述符,0, 1, 2 各自對應到標準輸入,標準輸出及標準錯誤輸出 make 1>results 2>ERRORS 將 make 的標準輸出傳給 results 文件,標準錯誤輸出寫入 ERRORS 文件 # make 程序運行時,> 會從定向打開的標準文件,若 make 向標準文件寫入信息,就會寫入從定向的文件內。 5, ~ 展開 ~ 表示當前登錄用戶的根目錄 ~username 表示 username 的根目錄 ~+ 和 $PWD 變量值相同 6, shell 基本通配符 ? 任何單一字符 * 任何的字符字符串 [set] 任何在 set 裏的字符 [!set] 任何不再 set 裏的字符 -- [a-c] a b c [a-zA-Z0-9_-] 任何一個字母,任何一個數字,下劃線或中劃線 7, 命令替換 - shell 執行命令,並替換爲命令執行後的結果 `` # 反引號 name=`echo hello` $() # name=$(echo hello) 8, 數學運算 expr expr 被設置在命令替換以內 i=0 i=`expr $i + 1` # 此時 $i 爲 1 9, 引用 i. 反斜槓轉義 ii. 單引號 會強制 shell 將一對引號之間的所有字符都看作其字面上的意義。不可以在一個單引號引用的字符串裏在捏前一個但引號,即便是反斜槓,在但引號裏也沒有特殊意義。 iii. 雙引號 雙引號會確切地處理括起來的文字中的轉移字符和變量,算術,命令替換 在雙引號裏,字符 $ " ` / 如用到字面上的意義,必須前置 /。 其他任何的字符前面的反斜槓都不帶有任何特殊意義。// remember 10, (...) subShell 是一羣被括在圓括號裏的命令,這些命令在另外的進程中執行。當需要讓一小組的命令在不同的目錄下執行時,這種方法可以讓你不必修改主腳本的目錄。 tar -cf - . | (cd /newdir; tar -xpf -) 11, {...} 代碼塊(code block), 基本與 subShell 相同,不過它不會建立新進程,代碼塊裏的命令以花括號括起來,且對主腳本的狀態會造成影響 12, shell 執行命令時的查找順序是: 特殊的內建命令 > shell 函數 > 一般內建命令 command program # 可以避開 shell 的包含函數 13, set 命令 i. 不加參數,會以排序的方式顯示所有 shell 變量的名稱與值 ii. set -- # 改變位置參數 iii. 打開或停用 shell 選項
/** * awk */ awk 讀取每個文件,用 RS 將每個文件分爲記錄,然後用 FS 將每個記錄切分爲字段。這個過程是自動完成的。 awk 中除 BEGIN 與 END 的模式都是對每條記錄匹配,如果匹配成功則執行模式對應的操作。 // 1, man awk # 查看手冊中詳細介紹 2, awk 有標量和數組兩種類型 3, 字符串一雙引號引起,不能用 單引號 沒有字符串連接運算符,兩個字符串在一起自然的被連接起來 "hello" "world" # 等於 "helloworld" 4, 數組 awk 的數組和 PHP 數組幾乎一樣 i. 任何數字和字符串可作爲索引 ii. 數組元素類型可以不一樣 不同的是: iii. 數組可以是多索引數組 name["myhere", "zhang"] 5, 命令行參數 ARGC 和 ARGV # 和 PHP 的 cli 意義一樣 內建數組 ENVIRON,保存所有環境變量 6, 變量無須被聲明,在第一次使用的時候自動被建立 一個變量不能同時用作標量變量和數組變量,如: names[1] = "myhere" # 這是錯誤的!!! delete names[1] names = "zhang" 7, 數組成員的測試 key in array # 成員測試, split("", array) # 清空數組 8, getline getline # 讀取文件下一條記錄到 $0,並更新 NF, NR, FNR getline var # 讀取下一條記錄到 var, 更新 NR, FNR getline < file # 從 file 讀下一條記錄到 $0, 更新 NF getline var < file # 從 file 讀下一條記錄到 var cmd | getline # 從外部命令讀取下一條記錄到 $0, 更新 NF cmd | getline var # 從外部命令讀取下一條記錄,存入 var 9, close 關閉文件 在 awk 中,文件打開後便會一直保持在打開狀態,直到明確指出要關閉他或知道程序終結 打開的文件在沒有 close 的情況下不能混用 > 和 >> (打開文件的方式不同) 10, system(command) 執行外部程序, system() 執行外部程序不需要用 close() 關閉文件 symtem("date") # close() 僅針對以 I/O 重定向運算符所打開的文件或管道,還有 getline,print,printf 11, 用戶自定義的函數 function sayHello(name){ print "hello " name; } 和 shell 一樣,awk 中全局變量在自定義函數中自動可見( C,JavaScript 也是這樣,PHP 不是); 函數定義參數列表中的參數都是局部參數,在函數體中的且未出現在函數定義參數列表中的參數都被認爲是全局變量; awk 允許函數調用是傳送的參數比定義時少,因此可以將函數中用到的變量放到函數定義中,防止污染全局變量環境 function find_key(array, value, key) # key 前置幾個空格,以區分 { for( key in array){ if( array[key] == value){ return key } } return "" } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ Shell 各版本規模 V7 Bourne Shell < POSIX Shell < (ksh93, bash) // 共通的 Shell 擴展 1, select 循環 select name [in list] do # do something done 2, [[ ... ]] [[ ... ]] 於 [ ... ] 不同之處在於不處理單詞展開與樣式展開(通配符)。意即它不需要使用引號以處理引文操作 3, 索引式數組 name=(val1 val2 val3) ${#name[*]} name 數組長度 # ${#str} 字符串長度
Agent智能體的工作流可以簡單分成兩種:一種是固定的靜態工作流,一種是智能體自主決策的動態工作流。 靜態流程的Agent舉幾個例子,例如新聞熱點追蹤推送Agent,每日新論文摘要總結Agent,它們的優點是可控,穩定,可復現,缺點是一種流
一. 二. 三. ! 作 者 : Yaopengfei(姚鵬飛) 博客地址 : http://www.cnblogs.com
大家好,我是R哥。 今天分享一個爽飛了的面試輔導 case: 這個杭州兄弟空窗期 1 個月+,面試了 6 家公司 0 Offer,不知道問題出在哪,難道是杭州的 IT 崩盤了麼? 報名面試輔導後,經過一個多月的輔導打磨,現在成功入職某上市
《Windows Azure Platform 系列文章目錄》 部署環境: 1.我們只有1個訂閱,1個Virtual Network 2.我們有1個Hub-VNet, 在Virtual Network上設置了DNS Se
vs2022開發工具最低支持net4.8,以下的如net3.5、4.0、4.5項目,加載不上怎麼處理。 一、下載.NET Framework框架 .NET Framework 4.5.2 .NET Framework 4.5.1 .NET
大家好,我是貓哥,今天給大家分享幾個高質量的技術類信息源。 本文分享的信息源都是週刊類型的,所謂週刊類,就是以固定每週的頻率更新,每期分享很多精華內容的鏈接。它的特點是信息密度極高,可以節省你去查找信息的時間,高效的學習者都會喜歡這類內容。
select anchor_table_schema || '.' || anchor_table_name as table_name, row_countfrom PROJECTION_STORAGEorder by row_co
最近在寫數據庫程序,需要一個高性能的結構化日誌記錄組件,簡單研究了一下Microsoft.Extensions.Logging和Serilog,還是決定重造一個輪子。 一、使用方法 直接參考以下示例代碼: NanoLogger.St
目錄錯誤原因解決方案 app.config.globalProperties 用法坑Vue, 多環境配置 https://www.cnblogs.com/vipsoft/p/16696640.html main.js import conf
這個錯誤通常與Node.js的加密模塊和OpenSSL版本有關 出現這個錯誤是因爲 node.js V17版本中最近發佈的OpenSSL3.0, 而OpenSSL3.0對允許算法和密鑰大小增加了嚴格的限制,可能會對生態系統造成一些影響. j
Windows 允許空密碼遠程桌面 開啓遠程 修改策略 輸入命令 secpol.msc 本地策略 -> 安全選項 -> 帳戶:使用空密碼的本地帳戶只允許進行控制檯登錄
上一次的介紹,主要圍繞如何統一去捕獲異常,以及爲每一種異常添加自己的Mapper實現,並且我們知道,當在ExceptionMapper中返回非200的Response,不支持application/json的響應類型,而是寫死的text/p
當你深夜在瀏覽器中輸入 www.baidu.com 時有沒有想過,除了月黑風高的夜和本機的瀏覽記錄,還有誰知道你訪問了它呢?要搞清楚這件事,首先我們要了解一下訪問網站時,這其中發生了什麼。 如果你在 10 年之前訪問網站,大概率會在瀏覽器的
話接上回《前端使用 Konva 實現可視化設計器(13)- 折線 - 最優路徑應用【思路篇】》,這一章繼續說說相關的代碼如何構思的,如何一步步構建數據模型可供 AStar 算法進行路徑規劃,最終畫出節點之間的連接折線。 請大家動動小手,給
時不時有人問我我的SSE優化Demo裏emphasize(邊緣強調)的原理是啥,有沒有寫博客,其實不是我不願意寫博客,而是那個東西太過於簡單,我不想寫博客。但是耐不住問的人多了,我就乾脆複製點資料放在博客裏吧,省的每次我還要去找點資料複