歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> 《Linux命令行與shell腳本編程大全》使用其他shell

《Linux命令行與shell腳本編程大全》使用其他shell

日期:2017/3/1 13:53:31   编辑:SHELL編程
《Linux命令行與shell腳本編程大全》使用其他shell 什麼是dash shell Debian的dash shell是ash shell的直系後代,ash shell是Unix系統上原來地Bourne shell的簡化版本。 NetBSD Unix操作系統移植了ash shell,並且作為默認shell。NetBSD開發人員給ash shell添加了一些新功能,使它更接近Bourne shell。新功能包括:emacs和vi編輯器命令進行命令行編輯,以及歷史命令來查看前面輸入的命令。ash shell這個版本也被FreeBSD作為默認 登錄shell Debian Linux發行版創建了它自己的ash shell版本(稱作Debian ash或dash)。 在很多基於Debain的Linux上默認shell並不是dash shell,而是bash shell。 Ubuntu Linux發行版將bash shell作為登錄shell,將dash shell用做默認的/bin/sh shell。 大多數Linux發行版上,/bin/sh文件是鏈接到/bin/bash shell程序的一個符號鏈接。 dash shell的特性 dash命令行參數 dash命令行參數 參數 描述 -a 導出分配給shell的所有變量 -c 從特定命令字符串讀取命令 -e 如果是非交互式shell的話,在有未經測試的命令失敗時立即退出 -f 顯示路徑名通配符 -n 如果是非交互式shell的話,讀取命令但不執行它們 -u 在嘗試展開一個未設置的變量時,將錯誤消息寫出到STDERR -v 在讀取輸入時將輸入寫出到STDERR -x 在執行命令時將每個命令寫出到STDERR -I 在交互式模式下,忽略輸入中的EOF字符 -i 強制shell運行在交互式模式下 -m 打開作業控制(在交互式模式下默認開啟) -s 從STDIN讀取命令(在沒有指定文件參數時的默認行為) -E 打開emacs命令行編輯器 -V 打開vi命令行編輯器 dash環境變量 變量 描述 CDPATH cd命令的搜索路徑 HISTSIZE 歷史記錄文件中保存的行數 HOME 用戶的默認登錄目錄 IFS 輸入字段分隔符。默認值是空格、制表符和換行符 MAIL 用戶收件箱文件的名稱 MAILCHECK 在收件箱文件中檢查新郵件的頻率 MAILPATH 冒號分割的多個收件箱文件名稱。設置了的話,這個值會覆蓋MAIL環境變量 OLDPWD 上一個工作目錄的值 PATH 可執行文件的默認查找路徑 PPID 當前shell的父進程的進程ID PS1 shell的主命令行交互提示符 PS2 shell的次命令行交互提示符 PS4 當設置了執行追蹤時,在每行前面打印的一個字符 PWD 當前工作目錄 TERM shell的默認終端設置 dash用set命令顯示環境變量 位置參數 $0:shell的名稱 $n:第n個位置的參數 $*:含有所有參數內容的單個值,由IFS環境變量中的第一個字符分隔;沒定義IFS的話由空格分隔 $@:將所有的命令行參數展開為多個參數 $#:位置參數的總數 $?:最近一個命令的退出狀態碼 $-:當前選項標記 $$:當前shell的進程ID(PID) $!:最近一個後台命令的進程ID(PID) 用戶自定義的環境變量 同bash規則完全一致 注意:dash的變量不支持可變數組! dash內建命令 dash shell內建命令 命令 描述 alias 創建代表文本字符串的別名字符串 bg 以後台模式繼續指定的作業 cd 切換到指定目錄 echo 顯示文本字符串和環境變量 eval 將所有參數用空格連起來(重新解析並執行這條命令) exec 用指定命令代替shell進程 exit 終止shell進程 export 導出指定的環境變量,供子shell使用 fc 列出、編輯或重新執行之前在命令行中輸入的命令 fg 以前台模式繼續指定的作業 getopts 從一列參數中提取選項和參數 hash 維護並提取最近執行的命令和他們的位置的哈希表 pwd 顯示當前工作目錄的值 read 從STDIN讀取一行並將其賦給一個變量 readonly 從STDIn讀取一行並賦給一個不能修改的變量 printf 用格式化過的字符串顯示文本和變量 set 列出或設置選項標記和環境變量 shift 按指定的次數移動位置參數 test 測試一個表達式,成立返回0,否則返回1 times 顯示當前shell和所有shell進程的累計用戶和系統時間 trap 在shell收到某個指定的信號時解析並執行命令 type 解釋指定的名稱並顯示解析結果(別名、內建、命令或關鍵字) ulimit 查詢或設置進程限制 umask 設置默認文件值和目錄權限 unalias 刪除指定的別名 unset 從導出的變量中刪除指定的變量或選項標記 wait 等待指定的命令完成然後返回退出 dash shell內建命令沒有操作歷史記錄或目錄棧的命令 dash腳本編程 創建dash腳本 同bash一樣,在第一行加上#!/bin/dash 就可以了。 不能使用的功能 bash shell有些功能沒法在dash shell中使用,這些通常稱作bash主義(bashism)。 1.使用算數運算 bash中支持下面3種方式: 使用expr命令:expr operation 使用方括號:$[ operation ] 使用雙圓括號:$(( operation )) dash只支持expr命令和雙圓括號,不支持方括號! 2.test命令 bash shell的test命令允許使用雙等號“==”來測試兩個字符串是否相等 dash shell的test命令只能識別“=”來比較字符串 3.echo語句選項 dash shell的echo能自動識別特殊字符,所以也沒有-e選項,如果使用-e,echo會將它視為普通文本 可以用printf顯示文本,printf在dash shell和bash shell中行為完全一致。 4.function命令 dash shell不支持使用function命令創建函數,必須使用函數名+圓括號的方式 zsh shell zsh shell一些獨特的功能: 改進的shell選項處理 shell兼容性模式 可加載模塊 zsh shell的組成 zsh shell命令行參數 參數 描述 -c 只執行指定的命令,然後退出 -i 做為交互式shell啟動,會提供一個命令行交互提示符 -s 強制shell從STDIN讀取命令 -o 指定命令行選項 -o允許設置shell選項來配置shell的功能 選項可以分成以下幾大類: 更改目錄:控制cd和dirs命令如何處理目錄更改的選項 補全:控制命令補全功能的選項 擴展和擴展匹配:控制命令中文件擴展的選項 歷史記錄:控制命令歷史記錄的選項 初始化:控制shell在啟動時如何處理變量和啟動文件的選項 輸入輸出:控制命令處理的選項 作業控制:控制shell如何處理作業和啟動作業的選項 提示:控制shell如何處理命令行提示符的選項 腳本和函數:控制shell如何處理shell腳本和定義函數的選項 shell模擬:允許設置zsh shell來模擬其他類型shell行為的選項 shell狀態:定義啟動哪種shell的選項 zle:控制zsh行編輯器功能的選項 選項別名:可以用做其他選項別名的特殊選項 1.shell狀態選項 有6種不同的zsh shell選項來定義shell啟動的類型 交互模式(-i,interactive):提供了命令行界面提示符來輸入內建命令和程序名 登錄模式(-l,login):默認的zsh shell類型,處理zsh shell的啟動文件並提供命令行界面提示符 特權模式(-p,privileged):有效的用戶ID(EUID)跟實際用戶ID不一致(用戶成為了root用戶)時的默認類型。它會禁止用戶啟動文件。 限制模式(-r,restricted):在shell中將用戶限定在特定目錄結構中 shin_stdin模式(-s):從STDIN讀取命令 single_command模式(-t):執行一條從STDIN讀取的命令,然後退出。 shell狀態定義了shell是否在啟動時提供命令行界面提示符,以及用戶在shell中有什麼訪問權限 2.shell模擬選項 bsd_echo:讓echo語句跟C shell的echo命令兼容 csh_junkie_history:用不帶指定的history命令來引用前面的命令 csh_junkie_loops:允許while和for循環使用類似於C shell的end,而不是do和done csh_junkie_quotes:修改使用單引號和雙引號的規則來跟C shell保持一致 csh_nullcmd:在執行沒有命令的重定向時,不使用NULLCMD和READNULLCMD變量的值 ksh_array:使用Korn風格的數組,采用從0開始的數字索引值,並在引用數組元素時使用方括號 ksh_autoload:模擬Korn shell的自動加載函數功能 ksh_option_print:模擬Korn shell打印選項的方法 ksh_typeset:替換處理typeset命令參數的方式 posix_builtins:使用builtin命令來執行內建命令 sh_file_expansion:在執行其他展開之前先進行文件名展開 sh_nullcmd:在進行重定向時不使用NULLCMD和READNULLCMD變量 sh_option_letters:用類似於Korn shell的方式解釋單字母命令行選項 sh_word_split:在未加引號的參數展開中執行字段分隔 traps_async:在等待程序退出時,處理信號並立即運行捕捉 3.初始化選項 all_export:所有的參數和變量會自動導出到子shell進程中 global_export:導出環境中的參數不會在函數中本地化 global_rcs:如果沒有設置,zsh shell不會運行全局啟動文件,但仍然會運行本地啟動文件 rcs:如果沒有設置,zsh shell會運行/etc/zshenv啟動文件,但不會運行其他文件 初始化選項允許指定在shell環境中運行哪些zsh shell啟動文件(如果有的話)。也可以在啟動文件中設置這些值來限定shell執行哪些選項 4.腳本和函數選項 c_bases:用C格式(0xdddd)顯示十六進制數而不是用shell格式(16#dddd) err_exit:如果命令以非零退出狀態碼退出,執行ZERR捕捉中的命令並退出 err_return:如果命令以非零退出狀態碼退出,立即從其所在函數返回 eval_lineno:如果設置了,用eval內建命令評估的表達式的行號會和shell環境中的其余部分分開記錄 exec:執行命令。如果未設置這個選項,會讀取命令並報告錯誤,但不會執行命令 function_argzero:將$0設置成函數名或腳本名 local_options:設置了的話,當shell函數返回時,恢復所有在該函數之前設置的選項 local_traps:設置了的話,當在函數內設置了信號捕捉,函數退出時恢復前一個捕捉的狀態 multios:在嘗試執行多個重定向時,執行隱式tee或cat命令 octal_zeros:將任何以0開頭的整數字符串都解釋成八進制數 typeset_silent:未設置的話,使用typeset和參數名來顯示參數的當前值 verbose:在shell讀取輸入行時顯示它們 xtrace:在shell執行命令時顯示命令和命令的參數 內建命令 核心內建命令 命令 描述 alias 為命令和參數定義一個替代性名稱 autoload 將shell函數預加載到內存中以便快速訪問 bg 以後台模式執行一個作業 bindkey 將組合鍵和命令綁定到一起 builtin 執行指定的內建命令而不是同樣名稱的可執行文件 bye 跟exit相同 cd 切換當前工作目錄 chdir 切換當前工作目錄 command 將指定命令當做外部文件執行而不是函數或內建命令 declare 設置變量的數據類型(同typeset) dirs 顯示目錄棧的內容 disabe 臨時禁用指定的哈希表元素 disown 從作業表中移出指定的作業 echo 顯示變量和文本 emulate 用zsh來模擬另一個shell,比如Bourne、Korn或C shell enable 使能指定的哈希表元素 eval 在當前shell進程中執行指定的命令和參數 exec 執行指定的命令和參數來替換當前shell進程 exit 退出shell並返回指定的退出狀態碼。如果沒有指定,使用最後一條命令的退出狀態碼 export 允許在子shell進程中使用指定的環境變量名及其值 false 返回退出狀態碼1 fc 從歷史記錄中選擇某范圍內的命令 fg 以前台模式執行指定的作業 float 將指定變量設為保存浮點值的變量 functions 將指定名稱設為函數 getln 從緩沖棧中讀取下一個值並將其放到指定變量中 getopts 提取命令行參數中的下一個有效選項並將它放到指定變量中 hash 直接修改命令哈希表的內容 history 列出歷史記錄文件中的命令 integer 將指定變量設為整數類型 jobs 列出指定作業的信息,或分配給shell進程的所有作業 kill 向指定進程或作業發送信號(默認為SIGTERM) let 執行算數運算並將結果賦給一個變量 limit 設置或顯示資源限制 local 為指定變量設置數據屬性 log 顯示受watch參數影響的當前登錄到系統上的所有用戶 logout 同exit,但只在shell是登錄shell時有效 popd 從目錄棧中刪除下一項 print 顯示變量和文本 printf 用C風格的格式字符串來顯示變量和文本 pushd 改變當前工作目錄,並將上一個目錄放到目錄棧中 pushln 將指定參數放到編輯緩沖棧中 pwd 顯示當前工作目錄的完整路徑名 read 讀取一行並用IFS變量將數據字段賦給指定變量 readonly 將值賦給不能修改的變量 rehash 重建命令哈希表 set 為shell設置選項或位置參數 setopt 為shell設置選項 shift 讀取並刪除第一個位置參數,然後將剩余的參數向前移動一個位置 source 找到指定文件並將其內容復制到當前位置 suspend 掛起shell的執行,直到它收到SIGCONT信號 test 如果指定條件為TRUE的話,返回退出狀態碼0 times 顯示當前shell以及shell中所有運行進程的累積用戶時間和系統時間 trap 阻斷指定信號從而讓shell無法處理,如果收到信號則執行指定命令 true 返回退出狀態碼0 ttyctl 鎖定和解鎖顯示 type 顯示shell會如何解釋指定的命令 typeset 設置或顯示變量的特性 ulimit 設置或顯示shell或shell中運行進程的資源限制 umask 設置或顯示創建文件和目錄的默認權限 unalias 刪除指定的命令別名 unfunction 刪除指定的已定義函數 unhash 刪除哈希表中的指定命令 unlimit 刪除指定的資源限制 unset 刪除指定的變量特征 unsetopt 刪除指定的shell選項 wait 等待指定的作業或進程完成 whence 顯示指定命令會如何被shell解釋 where 顯示指定命令的路徑名,如果shell找到的話 which 用csh風格的輸出顯示指定命令的路徑名 zcompile 編輯指定的函數或腳本從而能更快地自動加載 zmodload 對可加載zsh模塊執行特定操作 附加模塊 模塊 描述 zsh/cap POSIX兼容性命令 zsh/clone 將運行中的shell克隆到另一個終端的命令 zsh/compctl 控制命令補全的命令 zsh/complete 命令行補全命令 zsh/complist 命令行補全列表擴展命令 zsh/computil 命令行補全的實用工具命令 zsh/datetime 額外的日期和時間命令及變量 zsh/deltochar 重現了emacs功能的行編輯函數 zsh/files 基本的文件處理命令 zsh/mapfile 通過關聯數組來訪問外部文件 zsh/mathfunc 額外的科學函數 zsh/parameter 通過關聯數組來訪問命令哈希表 zsh/pcre 擴展的正則表達式庫 zsh/sched 按設定時間執行命令的計劃命令 zsh/net/socket Unix域套接字支持 zsh/stat 訪問stat系統調用來提供系統的統計狀況 zsh/system 訪問各種底層系統功能的接口 zsh/net/tcp 訪問TCP套接字 zsh/termcap termcap數據庫的接口 zsh/terminfo terminfo數據庫的接口 zsh/zftp 專用FTP客戶端命令 zsh/zle zsh行編輯器 zsh/zleparameter 用變量訪問並修改zle zsh/zprof 允許對shell函數進行性能參數統計 zsh/zpty 在虛擬終端中執行一條命令 zsh/zselect 阻斷,直到文件描述符就緒才返回 zsh/zutil 各種shell實用工具 查看、添加和刪除模塊 查看 執行zmodload即可 [plain] % zmodload zsh/complete zsh/computil zsh/main zsh/parameter zsh/terminfo zsh/zle zsh/zutil 添加 zmodload +模塊名稱 可惜的是,執行完畢之後,不會有任何輸出來告知模塊添加完畢,不過可以再次執行zmodload查看 [plain] % zmodload zsh/zftp % zmodload zsh/complete zsh/computil zsh/main zsh/net/tcp zsh/parameter zsh/terminfo zsh/zftp zsh/zle zsh/zutil 刪除 zmodload -u +模塊命令 [plain] % zmodload -u zsh/zftp 注意:通常會將zmodload命令放到$HOME/.zshrc啟動文件中,這樣在zsh啟動時,常用的函數就會自動加載 zsh腳本編程 數學運算 zsh提供兩種方法執行數學運算: 1.let命令 2.雙圓括號 注意:實用let時,在表達式前後加上雙引號才能支持空格 [plain] % let a="1 + 2 * 3" % echo $a 7 為了解決精度問題,可以使用printf [plain] % ((b = 2 + 3.1/2.2)) % echo $b 3.4090909091 % printf "%6.3f\n" $b 3.409 注意:如果沒有使用typeset來聲明變量的數據類型,那麼zsh會嘗試自動分配數據類型 數學函數 安裝zsh/mathfunc即可 查看函數清單可參閱zshmodules [plain] % echo $((sqrt(9))) 3. 結構化命令 if-then-else語句 for循環(包括C風格) while循環 until循環 select語句 case語句 上面的語句與bash使用方法完全一致,除此之外,zsh還支持repeat結構化命令 repeat語法格式: [plain] repeat param do commands done param必須是一個數字或者結果為數字的表達式 [plain] % repeat 3 repeat> do repeat> echo "test" repeat> done test test test 函數 zsh shell支持使用function和圓括號定義函數名來創建自定義函數 使用全局變量的方法同bash shell [plain] #!/bin/zsh test_add () { printf $(($1 + $2)) } test_add 3 7 使用方法與bash shell一致。 [plain] % ./zsh_test 10% 可以不將函數放在腳本中。zsh shell通過fpath環境變量查找函數,可以放到fpath下的任何目錄中。 但是使用之前,必須執行autoload命令(和bash shell的source命令或點命令類似吧) zcompile會處理函數文件並為shell創建一個編譯後的版本。 它會將函數編譯成二進制格式,使zsh能夠更快的加載。 運行zcompile命令後,它會創建這個函數文件的.zwc版本。在autoload命令在fpath中查找命令時,它會查看這個命令的.zwc版本,而不是文本版本。
Copyright © Linux教程網 All Rights Reserved