在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux shell腳本經驗分享

汽車玩家 ? 來源:面包板社區 ? 作者:面包板社區 ? 2020-04-04 17:28 ? 次閱讀

作為一枚Linux嵌入式程序猿,寫shell腳本也是經常碰到的工作,在這個過程中或多或少踩過一些坑,也積累了一些經驗,在此分享給大家,希望能對大家有點幫助。

1. 指定bash

我們知道在shell 腳本的第一行,都應該指定bash,那#!之后到底應該是什么呢?

這個問題估計不同的人的回答可能都不一樣。我見過/usr/bin/env bash,也見過/bin/bash,還有/usr/bin/bash,還有/bin/sh,還有/usr/bin/env sh。我自己也用過其中過的幾個,其實在很多情況下,以上幾種寫法效果都是相同的。但是,坑我們的往往就是少數情況~

如果恰好碰到系統的默認shell不是bash怎么辦?比如某Linux發行版的某個版本,默認的 sh 就不是 bash。如果系統的bash不是在/usr/bin/bash怎么辦?

還有關于bash和sh的一些小區別:

假設我們寫一小段腳本,看看運行結果!

#!/bin/sh

source mlryj.sh

echo “hello world!”

執行結果:

Linux shell腳本經驗分享

然后我們將腳本改成這樣

#!/bin/bash

source mlryj.sh

echo “hello world!”

執行結果:

Linux shell腳本經驗分享

從結果看,在#!/bin/sh的情況下,在mlryj.sh這個腳本不存在的情況下,source不成功,不會運行source后面的代碼。

而在#!/bin/bash的情況下,雖然source不成功,但是還是運行了source后面的echo語句。

為什么會這樣呢?

接下來我們看一看/bin/sh是個什么東西。

Linux shell腳本經驗分享

從上面可以看到,sh只是bash的一個軟鏈接,在一般的linux系統當中,sh調用執行腳本相當于打開了bash的posix模式,也就是說 /bin/sh 相當于 /bin/bash --posix。posix的特定規范之一是,當某行代碼出錯時,便不繼續往下解釋。

把腳本改成如下圖所示的格式,我們得到運行結果和#!/bin/sh是一樣的。

#!/bin/bash --posix

source mlryj.sh

echo “hello world!”

推薦大家使用 /usr/bin/env bash 和 /bin/bash。前者通過env添加一個中間層,讓env在PATH中搜索bash;后者畢竟是有官方背書的,約定俗成的bash位置。但是當腳本出現了錯誤怎么辦呢?請看Tip2。

2. set -e 和 set -x

好了,關于指定bash已經完成了。接下來該開始寫shell腳本第二行、第三行。

小編建議:在你開始構思并寫下具體的代碼邏輯之前,先插入一行“set -e”和一行“set -x”。

set -x會在執行每一行shell腳本時,把執行的內容輸出來。它可以讓你看到當前執行的情況,里面涉及的變量也會被替換成實際的值。

set -e會在執行出錯時結束程序,就像其他語言中的“拋出異?!币粯印?/p>

這兩個組合在一起,可以在debug的時候替自己節省許多時間。出于防御性編程的考慮,有必要在寫第一行具體的代碼之前就插入它們。捫心自問,寫代碼的時候能夠一次寫對的次數有多少?大多數代碼,在提交之前,通常都經歷過反復調試修改的過程。與其在焦頭爛額之際才引入這兩個配置,不如一開始就給調試留下余地。在代碼終于可以提交之后,再考慮是否保留它們也不遲。

#!/bin/sh

set -x

set -e

source mlryj.sh

echo “hello world!”

運行結果如下:

Linux shell腳本經驗分享

3. shellcheck

加了set -x和set -e后,現在我已經有了shell開始的三行代碼,但是具體的業務邏輯一行都沒寫。是不是該開始寫了?

且慢!工欲善其事,必先利其器。小編先給各位介紹一個shell腳本編寫神器:shellcheck

很慚愧,雖然這幾年寫了一些shell腳本,但是真正寫起來的時候還是有很多語法記不清楚。這時候就要依仗shellcheck了。

shellcheck除了可以提醒語法問題以外,還能檢查出shell腳本編寫常見的錯誤代碼。相信我,使用shellcheck會給我們的shell編寫能力帶來了巨大的飛躍的。

安裝方法如下圖:

Linux shell腳本經驗分享

安裝完成后可以通過shellcheck -V查看當前安裝成功的版本號。如下圖:

Linux shell腳本經驗分享

雖然我們技能不如別人,但是我們可以升級裝備,在裝備上趕上并超過對方啊!有了shellcheck加持就好比真三中諸葛亮帶上了飛鞋,郭嘉買了孫子兵法,哈哈哈~~

4. 注意local

首先我們來看一下下面兩段代碼及運行結果,代碼段1:

#!/bin/bash

set -x

set -e

function wgytest()

{

a=$1

echo a

}

wgytest shell

echo “hello world!”

echo $a

運行結果如下圖所示:

Linux shell腳本經驗分享

代碼段2:

#!/bin/bash

set -x

set -e

function wgytest()

{

local a=$1

echo a

}

wgytest shell

echo “hello world!”

echo $a

運行結果如下圖所示:

Linux shell腳本經驗分享

從上面的代碼可以看出,我們只是將函數wgytest中的變量a加了local限定詞,運行結果可以看出,第二段代碼最后的echo并沒有輸出變量a的內容。

這是因為在bash,如果不加local限定詞,變量默認都是全局的。在頂級作用域里,是否是全局變量并不重要。但是在函數里面,聲明一個全局變量可能會污染到其他作用域,尤其在你根本沒有注意到這一點的情況下。當我們開始把重復的邏輯提煉成函數,這時就有可能會掉到bash的這一個坑里。所以,對于在函數內聲明的變量,小編的建議是記得加上local限定詞。

5. 寫在最后

以上幾條都是具體的建議,這條來點虛的。

雖然使用shell可以方便快捷地實現各種復雜的功能,但也還是不得不依靠grep、sed、awk等各種工具把它們粘合在一起。實際上由于缺乏完善的數據結構以及一致的API,shell腳本在處理復雜的邏輯上還是顯得力不從心。如果你的任務包含較為復雜的邏輯,而且數據結構復雜,那么建議使用python之類的語言編寫腳本。

程序猿無論寫什么代碼,都要三思而行,切忌粗心大意。畢竟許多時候,我們的一個粗心就會給整個系統帶來一個悲劇,其實復雜的腳本也是發端于幾行小小的命令。一開始寫腳本的人,也許以為它只是一次性任務。代碼里難免對一些外部條件有些假定,在當時也許是正常的,但是隨著外部環境的變化,這些就成了隱藏的雷。這就需要在編寫的時候辨清哪些是會變的依賴、哪些是腳本正常運行所不可或缺的。同時要有防御性編程的意識,給自己的代碼一道護城河。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11432

    瀏覽量

    212466
  • Shell
    +關注

    關注

    1

    文章

    371

    瀏覽量

    23858
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    樹莓派新手必看!在樹莓派上編寫和運行 Shell 腳本!

    在本教程中,我將討論Shell腳本的基礎知識、它們的用途以及如何在RaspberryPi上編寫和運行Shell腳本。什么是Shell
    的頭像 發表于 03-25 09:28 ?195次閱讀
    樹莓派新手必看!在樹莓派上編寫和運行 <b class='flag-5'>Shell</b> <b class='flag-5'>腳本</b>!

    腳本美化高手之輕松實現文本顏色和背景定制的酷炫Shell技巧

    shell腳本中 echo 和 printf 都可以輸出內容。示例1: echo -e "?33[43;35m david use echo say Hello World ?33[0m
    的頭像 發表于 12-06 10:38 ?542次閱讀
    <b class='flag-5'>腳本</b>美化高手之輕松實現文本顏色和背景定制的酷炫<b class='flag-5'>Shell</b>技巧

    Linux從零到精通:最簡單的Shell腳本入門教程

    case語句 shell變量數組 shell腳本前言 |為什么學習shell編程 Shell腳本
    的頭像 發表于 12-05 09:56 ?1262次閱讀
    <b class='flag-5'>Linux</b>從零到精通:最簡單的<b class='flag-5'>Shell</b><b class='flag-5'>腳本</b>入門教程

    Linux系統中shell命令解析

    shellLinux系統的用戶界面,提供了用戶與內核交互的一種接口,它接收用戶輸入的命令并到送到內核去執行,因此也被稱為Linux的命令解釋器。
    的頭像 發表于 11-05 15:40 ?704次閱讀

    TCSH shell 編程入門

    ICer從業人員最先需要掌握的語言,就是linux shell語言。TCSH是ICer使用最多的Shell語言,可以說ICer入門語言從TCSH開始。
    發表于 11-01 10:45 ?0次下載

    Linux計劃任務crontab運行腳本不正確的問題

    寫好的程序希望在崩潰之后能夠自啟動,于是利用linux的crontab功能,添加一個計劃任務,每分鐘執行一個腳本查看需要監控的進程是否還在,如果不在則啟動之,否則不做任何事情。這么一個簡單的腳本在crontab中運行和在
    的頭像 發表于 10-23 13:36 ?837次閱讀

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之函數

    shell中的函數定義比較簡單,定義函數名可以沒有類型,函數返回值可有可無,如果有返回值,必須返回整數n(0~255)。同時,函數的定義必須放在shell腳本的開頭部分,只有函數被shell
    發表于 09-23 10:18

    飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之函數

    shell中的函數定義比較簡單,定義函數名可以沒有類型,函數返回值可有可無,如果有返回值,必須返回整數n(0~255)。同時,函數的定義必須放在shell腳本的開頭部分,只有函數被shell
    發表于 09-06 10:33

    shell腳本執行的三種方式及區別

    Linux系統中,Shell腳本是一種非常實用的工具,用于自動化執行一系列命令。Shell腳本可以大大提高工作效率,簡化復雜的任務。在這篇
    的頭像 發表于 08-30 15:24 ?1926次閱讀

    執行shell腳本的方式包括什么

    執行Shell腳本的方式有很多種,以下是一些常見的方法: 直接運行腳本文件 在命令行中,可以直接使用腳本文件的路徑來運行腳本。例如: ./s
    的頭像 發表于 08-30 15:17 ?587次閱讀

    shell具有的功能和特點

    是執行命令。用戶可以在 Shell 提示符下輸入命令,Shell 會解析命令并將其傳遞給操作系統執行。Shell 支持各種類型的命令,包括內置命令、外部命令和腳本命令。 命令歷史
    的頭像 發表于 08-30 14:48 ?1114次閱讀

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之本地腳本的編寫和執行

    :3)shell應用程序執行shell腳本也可直接使用shell應用程序進行執行。我們前面說過,我們指定的shell應用為/bin/bash
    發表于 08-29 10:51

    shell腳本編寫之本地腳本的編寫和執行

    用來指定使用的shell應用;echo "my first shell !"為腳本中編寫的命令代碼。2、執行在執行腳本時,腳本
    發表于 08-28 09:36

    嵌入式學習-shell介紹

    一、Shell是什么?我們在剛開始接觸Linux的時候,經常會聽到工程師提到Shell這個詞,剛開始不知道這是個干什么的,簡單的說,它是一個應用,接收用戶命令,調用相應的內核接口函數或應用程序,并
    發表于 08-16 09:13

    shell基本介紹及常用命令之shell介紹

    一、Shell是什么?我們在剛開始接觸Linux的時候,經常會聽到工程師提到Shell這個詞,剛開始不知道這是個干什么的,簡單的說,它是一個應用,接收用戶命令,調用相應的內核接口函數或應用程序,并
    發表于 08-15 09:28
    主站蜘蛛池模板: 天天搞天天色 | 97理论三级九七午夜在线观看 | 四虎最新免费网址 | 国产大乳孕妇喷奶水在线观看 | 手机看片国产免费现在观看 | 精品综合久久88色鬼首页 | 人人爽天天碰天天躁夜夜躁 | 下农村女人一级毛片 | 美女扒开腿让男人桶尿口 | 婷婷开心激情 | 免费成人毛片 | 特级全黄大片 | 美女被啪到哭网站在线观看 | 在线视频 二区 | 久久久美女视频 | 欧美午夜视频在线 | 三级精品在线观看 | 玖玖精品国产 | 日本人zzzwww| 免费理论片在线观看播放 | 色五阁 | 国产精品国产三级在线高清观看 | 国产三级网 | 国产欧美亚洲精品第二区首页 | 亚洲一二三区视频 | 五月婷婷丁香在线视频 | 天堂网ww | 六月色婷婷 | 中文永久免费看电视网站入口 | 在线天堂中文在线资源网 | 天天做天天操 | 日韩城人视频 | 婷婷丁香色综合狠狠色 | 午夜小视频网站 | 国产卡1卡2卡三卡网站免费 | 草草影院ccyy国产日本欧美 | 四虎永久精品视频在线 | 色综合久久综合欧美综合图片 | 欧美在线精品一区二区三区 | 97天天摸天天碰天天爽 | 一级视频在线播放 |