常見的各種shell及其區別

常見的各種shell及其區別

引子

for((i=1;i<=10;i++));  
do   
echo $(expr $i \* 3 + 1);  
done  

網上搜到的 shell for循環腳本,別人都能正常運行,我卻報錯:

 Syntax error: Bad for loop variable

究竟是怎么回事呢?

shell簡介

Shell 既是一種腳本編程語言,也是一個連接內核和用戶的軟件。在 Linux 發展的早期,唯一能用的工具就是 Shell,Linux 用戶都是在 Shell 中輸入文本命令,并查看文本輸出;如果有必要的話,Shell 也能顯示一些基本的圖形。常見的 Shell 有 sh、bash、csh、tcsh、ash、dash、zsh 等。

各種shell

  • Bourne shell (sh) UNIX 最初使用,且在每種 UNIX 上都可以使用。在 shell 編程方面相當優秀,但在處理與用戶的交互方面做得不如其他幾種shell。 sh 的全稱是 Bourne shell,由 AT&T 公司的 Steve Bourne開發,為了紀念他,就用他的名字命名了。

  • C shell (csh) csh,一個語法上接近于C語言的shell。 sh 之后另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計的,這個 shell 的語法有點類似C語言,所以才得名為 C shell ,簡稱為 csh。

  • Korn shell (ksh) 完全向上兼容 Bourne shell 并包含了 C shell 的很多特性。

  • Bourne Again shell (bash) 因為Linux 操作系統缺省的 shell。即 bash 是 Bourne shell 的擴展,與 Bourne shell 完全向后兼容。在 Bourne shell 的基礎上增加、增強了很多特性。可以提供如命令補全、命令編輯和命令歷史表等功能。包含了很多 C shell 和 Korn shell 中的優點,有靈活和強大的編程接口,同時又有很友好的用戶界面。

  • Debian Almquist shell (dash) 原來bash是GNU/Linux 操作系統中的 /bin/sh 的符號連接,但由于bash過于復雜,有人把 bash 從 NetBSD 移植到 Linux 并更名為 dash,且/bin/sh符號連接到dash。Dash Shell 比 Bash Shell 小的多(ubuntu16.04上,bash大概1M,dash只有150K),符合POSIX標準。Ubuntu 6.10開始默認是Dash。

  • zsh zsh配置復雜,所以很多人都不會使用。直到有一天出了Oh My Zsh項目(https://github.com/robbyrussell/oh-my-zsh),才讓更多人發現并開始使用zsh。有人說zsh是終極shell。zsh很漂亮,很炫酷,以前是極客使用,現在小白通過oh-my-zsh可以炫耀。

規范和建議

#! 是一個特殊標記,讀作 Shebang,說明這是一個可執行的腳本。除了第一行,其他以#開頭的都不再生效,為注釋。#! 后面是腳本的解釋器程序路徑。這個程序可以是shell,程序語言或者其他通用程序,常用的是bash、sh。

Shebang標記為 #!/bin/sh 的腳本不應使用任何 POSIX 沒有規定的特性 (如 let 等命令, 但 #!/bin/bash 可以)。bash支持的寫法比dash(ubuntu中的sh)多很多。想要支持 sh xx.sh 運行的,必須遵照 POSIX 規范去寫。想要腳本寫法多樣化,不需要考慮效率的,可以將文件頭定義為 #!/bin/bash , 而且不要使用 sh xx.sh 這種運行方式。 要么就更換 sh 的軟鏈接。

關于Shebang:Linux中的二進制可執行文件和腳本可執行文件及Shebang

bash 與 dash 的區別

語法上的主要的區別有:

1. 定義函數

bash: function在bash中為關鍵字
dash: dash中沒有function這個關鍵字

2. select var in list; do command; done

bash:支持
dash:不支持, 替代方法:采用while+read+case來實現

3. echo {0…10}

bash:支持{n…m}展開
dash:不支持,替代方法, 采用seq外部命令

4. here string

bash:支持here string
dash:不支持, 替代方法:可采用here documents

5. >&word重定向標準輸出和標準錯誤

bash: 當word為非數字時,>&word變成重定向標準錯誤和標準輸出到文件word
dash: >&word, word不支持非數字, 替代方法: >word 2>&1; 常見用法 >/dev/null 2>&1

6. 數組

bash: 支持數組, bash4支持關聯數組
dash: 不支持數組,替代方法, 采用變量名+序號來實現類似的效果

7. 子字符串擴展

bash: 支持parameter:offset:length,parameter:offset:length,{parameter:offset}
dash: 不支持, 替代方法:采用expr或cut外部命令代替

8. 大小寫轉換

bash: 支持parameterpattern,parameterpattern,{parameter^^pattern},parameter,pattern,parameter,pattern,{parameter,pattern}
dash: 不支持,替代方法:采用tr/sed/awk等外部命令轉換

9. 進程替換<(command), >(command)

bash: 支持進程替換
dash: 不支持, 替代方法, 通過臨時文件中轉

10. [ string1 = string2 ] 和 [ string1 == string2 ]

bash: 支持兩者
dash: 只支持=

11. [[ 加強版test

bash: 支持[[ ]], 可實現正則匹配等強大功能
dash: 不支持[[ ]], 替代方法,采用外部命令

12. for (( expr1 ; expr2 ; expr3 )) ; do list ; done

bash: 支持C語言格式的for循環
dash: 不支持該格式的for, 替代方法,用while+((expression))實現13.let命令和((expression))bash:有內置命令let,也支持((expression))方式dash:不支持,替代方法,采用((expression))實現13.let命令和((expression))bash:有內置命令let,也支持((expression))方式dash:不支持,替代方法,采用((expression))或者外部命令做計算

14. $((expression))

bash: 支持id++,id–,++id,–id這樣到表達式
dash: 不支持++,–, 替代方法:id+=1,id-=1, id=id+1,id=id-1

15. 其它常用命令

bash: 支持 echo -e, 支持 declare
dash: 不支持。

更換sh軟鏈接

由于在 ubuntu 16.04 之后,sh 命令默認是 dash,相對于 bash 缺少了許多語法支持,我們要么像之前說的那樣,使用 Shebang #!/bin/bash 來指定 shell 腳本的解釋器,要么就直接更換掉 sh 命令的軟鏈接。筆者測試系統為 ubuntu 18.04。

我們可以通過 cat /etc/shells 來查看本機支持的 shell 類型,通過 cat /etc/passwd 來查看目前 sh 命令的默認設置(一般在輸出的第一行)。

我們也可以通過 tpye 命令來查看一下本機的 sh 命令執行的是哪個文件:

type sh
# 輸出為:sh is hashed (/bin/sh)

不出所料,就是 /bin/sh ,然后我們用 file 命令查看該文件指向的軟鏈接:

file /bin/sh
# 輸出為:/bin/sh: symbolic link to dash

果然,默認是 dash。這使得我們很多語法不能支持(詳見上一小節),我們這里直接將其軟鏈接修改到 /bin/bash。我們可以先查看一下 /bin 目錄下存在的 shell:

ls -l /bin | grep sh
# 輸出:
# -rwxr-xr-x 1 root root 1113504 6月   7  2019 bash
# -rwxr-xr-x 1 root root  121432 1月  25  2018 dash
# lrwxrwxrwx 1 root root       4 12月 10  2020 rbash -> bash
# lrwxrwxrwx 1 root root       4 12月 10  2020 sh -> dash
# lrwxrwxrwx 1 root root       4 12月 10  2020 sh.distrib -> dash
# lrwxrwxrwx 1 root root       7 9月  18  2020 static-sh -> busybox

可以看到 dash 和 bash 都有,但是現在 sh 命令是指向 dash 的,好了,我們現在來修改軟鏈接:

sudo ln -snf bash sh

現在再來試一下之前的循環腳本,就可以直接運行了。

Ref:

https://www.huoxiaoqiang.com/experience/linux/1077.html

https://www.cnblogs.com/macrored/p/11548347.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532642.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

shell腳本 變量

shell腳本 變量類型 什么是Shell變量 用一個固定的字符串去表示不固定的內容。 Shell變量的類型 shell腳本中自定義變量的類型&#xff0c;我們這里分為&#xff1a; 自定義變量環境變量位置變量與定義變量 這四類&#xff0c;它們有一些相同點&#xff0c;但又有些不同點…

攻防世界web新手區解題 /cookie / disabled_button / weak_auth

cookie 題目描述&#xff1a;X老師告訴小寧他在cookie里放了些東西&#xff0c;小寧疑惑地想&#xff1a;‘這是夾心餅干的意思嗎&#xff1f;’ 使用burp suite抓包查看 發現提示&#xff1a; look-herecookie.php 于是在url后加上 cookie.php 得到提示查看返回 就得到了f…

Python 函數式編程

Python 函數式編程 轉自&#xff1a;https://www.liaoxuefeng.com/wiki/1016959663602400/1017328525009056&#xff0c;推薦去該鏈接讀原文&#xff0c;有習題和熱烈的評論區交流。 函數式編程 函數是Python內建支持的一種封裝&#xff0c;我們通過把大段代碼拆成函數&…

Python中的生成器與迭代器

Python中的生成器與迭代器 轉自&#xff1a;https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640&#xff0c;推薦去該鏈接讀原文&#xff0c;有習題和熱烈的評論區交流。 生成器 通過列表生成式&#xff0c;我們可以直接創建一個列表。但是&#xff0c;受…

基于GET報錯的sql注入,sqli-lab 1~4

根據注入類型可將sql注入分為兩類&#xff1a;數字型和字符型 例如&#xff1a; 數字型&#xff1a; sleect * from table where if 用戶輸入id 字符型&#xff1a;select * from table where id 用戶輸入id &#xff08;有引號) 通過URL中修改對應的D值&#xff0c;為正常數字…

Python 裝飾器詳解(上)

Python 裝飾器詳解&#xff08;上&#xff09; 轉自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84396970&#xff0c;博主僅對其中 demo 實現中不適合python3 版本的語法進行修改&#xff0c;并微調了排版&#xff0c;本轉載博客全部例程博主均已親測可行…

xss原理和注入類型

XSS漏洞原理 : XSS又叫CSS(cross Site Script), 跨站腳本攻擊,指的是惡意攻擊者往Web頁面里插入惡意JS代碼,當用戶瀏覽該頁時,嵌入其中的Web里的JS代碼就會被執行,從而達到惡意的特殊目的. 比如:拿到cooike XSS漏洞分類: 反射性(非存儲型) payload沒有經過存儲,后端接收后,直接…

Python 裝飾器詳解(中)

Python 裝飾器詳解&#xff08;中&#xff09; 轉自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84581272&#xff0c;博主僅對其中 demo 實現中不適合python3 版本的語法進行修改&#xff0c;并微調了排版&#xff0c;本轉載博客全部例程博主均已親測可行…

存儲型xss案例

存儲型xss原理: 攻擊者在頁面插入xss代碼,服務端將數據存入數據庫,當用戶訪問存在xss漏洞的頁面時,服務端從數據庫取出數據展示到頁面上,導致xss代碼執行,達到攻擊效果 案例: 在一個搭建的論壇網站中, 根據存儲型xss注入的條件,要找到可以存儲到數據庫的輸入位置,并且這個位置…

反射型XSS案例

**原理:**攻擊者將url中插入xss代碼,服務端將url中的xss代碼輸出到頁面上,攻擊者將帶有xss代碼的url發送給用戶,用戶打開后受到xss攻擊 需要url中有可以修改的參數 案例: 可能存在反射型xss的功能(點) : 搜索框等&#xff08;所有url會出現參數的地方都可以嘗試&#xff09;……

Python 裝飾器詳解(下)

Python 裝飾器詳解&#xff08;下&#xff09; 轉自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84627016&#xff0c;博主僅對其中 demo 實現中不適合python3 版本的語法進行修改&#xff0c;并微調了排版&#xff0c;本轉載博客全部例程博主均已親測可行…

xss-lab靶場通關writeup(1~6.......在更新)

level 2 : 標簽被編碼&#xff0c;利用屬性完成彈窗 輸入 發現沒有彈窗 查看源代碼&#xff1a; 發現&#xff1a; <>符號被編碼 說明keybord參數進行了處理&#xff0c;那么只能從屬性上進行惡意編碼&#xff1a;先將屬性的引號和標簽閉合&#xff0c;用 // 將后面的…

PyTorch 分布式訓練DDP 單機多卡快速上手

PyTorch 分布式訓練DDP 單機多卡快速上手 本文旨在幫助新人快速上手最有效的 PyTorch 單機多卡訓練&#xff0c;對于 PyTorch 分布式訓練的理論介紹、多方案對比&#xff0c;本文不做詳細介紹&#xff0c;有興趣的讀者可參考&#xff1a; [分布式訓練] 單機多卡的正確打開方式…

Linux free 命令詳解

Linux free 命令詳解 free 命令用來查看系統中已用的和可用的內存。 命令選項及輸出簡介 關于各種命令的功能和命令選項&#xff0c;還是推薦英語比較好的同學直接看手冊 RTFM&#xff1a;man free。這里簡單總結一下一些重點&#xff1a; 功能及輸出簡介 free 命令顯示系…

CTF web題 wp:

1.簽到題 火狐F12查看源碼&#xff0c;發現注釋&#xff1a; 一次base64解碼出flag 2.Encode 在這里插入圖片描述 和第一題界面一樣&#xff1f;&#xff1f; 輕車熟路f12&#xff1a; 發現編碼&#xff1a; 格式看上去是base64&#xff0c;連續兩次base64后&#xff0c;觀…

【深度學習】深入理解Batch Normalization批歸一化

【深度學習】深入理解Batch Normalization批歸一化 轉自&#xff1a;https://www.cnblogs.com/guoyaohua/p/8724433.html 這幾天面試經常被問到BN層的原理&#xff0c;雖然回答上來了&#xff0c;但還是感覺答得不是很好&#xff0c;今天仔細研究了一下Batch Normalization的原…

ThinkPHP V5 漏洞利用

ThinkPHP 5漏洞簡介 ThinkPHP官方2018年12月9日發布重要的安全更新&#xff0c;修復了一個嚴重的遠程代碼執行漏洞。該更新主要涉及一個安全更新&#xff0c;由于框架對控制器名沒有進行足夠的檢測會導致在沒有開啟強制路由的情況下可能的getshell漏洞&#xff0c;受影響的版本…

Vim 重復操作的宏錄制

Vim 重復操作的宏錄制 轉自&#xff1a;https://www.cnblogs.com/ini_always/archive/2011/09/21/2184446.html 在編輯某個文件的時候&#xff0c;可能會出現需要對某種特定的操作進行許多次的情況&#xff0c;以編輯下面的文件為例&#xff1a; ; ;This is a sample config…

Vim 進階1

Vim 進階1 所有你覺得簡單重復&#xff0c;可以自動化實現的操作&#xff0c;都是可以自動化實現的。 Vim光標移動拾遺 w&#xff1a;下一個單詞的開頭&#xff0c;e&#xff1a;下一個單詞的結尾&#xff0c;b&#xff1a;上一個單詞的開頭&#xff0c; 0&#xff1a;行首…

攻防世界web題ics-06(爆破id值)

打開界面&#xff1a;嚯&#xff01;這花里胡哨 點來點去只有報表中心有回顯&#xff1a; 發現url中id等于1&#xff0c;sql注入嘗試無果&#xff0c; burp工具爆破id 對id的值進行爆破 burp報ERROR的話這是個bug&#xff0c;先點擊Hex后點decimal手動刷新就可以使用 強行總…