chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux shell腳本經(jīng)驗(yàn)分享

汽車玩家 ? 來(lái)源:面包板社區(qū) ? 作者:面包板社區(qū) ? 2020-04-04 17:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作為一枚Linux嵌入式程序猿,寫shell腳本也是經(jīng)常碰到的工作,在這個(gè)過(guò)程中或多或少踩過(guò)一些坑,也積累了一些經(jīng)驗(yàn),在此分享給大家,希望能對(duì)大家有點(diǎn)幫助。

1. 指定bash

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

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

如果恰好碰到系統(tǒng)的默認(rèn)shell不是bash怎么辦?比如某Linux發(fā)行版的某個(gè)版本,默認(rèn)的 sh 就不是 bash。如果系統(tǒng)的bash不是在/usr/bin/bash怎么辦?

還有關(guān)于bash和sh的一些小區(qū)別:

假設(shè)我們寫一小段腳本,看看運(yùn)行結(jié)果!

#!/bin/sh

source mlryj.sh

echo “hello world!”

執(zhí)行結(jié)果:

Linux shell腳本經(jīng)驗(yàn)分享

然后我們將腳本改成這樣

#!/bin/bash

source mlryj.sh

echo “hello world!”

執(zhí)行結(jié)果:

Linux shell腳本經(jīng)驗(yàn)分享

從結(jié)果看,在#!/bin/sh的情況下,在mlryj.sh這個(gè)腳本不存在的情況下,source不成功,不會(huì)運(yùn)行source后面的代碼。

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

為什么會(huì)這樣呢?

接下來(lái)我們看一看/bin/sh是個(gè)什么東西。

Linux shell腳本經(jīng)驗(yàn)分享

從上面可以看到,sh只是bash的一個(gè)軟鏈接,在一般的linux系統(tǒng)當(dāng)中,sh調(diào)用執(zhí)行腳本相當(dāng)于打開(kāi)了bash的posix模式,也就是說(shuō) /bin/sh 相當(dāng)于 /bin/bash --posix。posix的特定規(guī)范之一是,當(dāng)某行代碼出錯(cuò)時(shí),便不繼續(xù)往下解釋。

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

#!/bin/bash --posix

source mlryj.sh

echo “hello world!”

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

2. set -e 和 set -x

好了,關(guān)于指定bash已經(jīng)完成了。接下來(lái)該開(kāi)始寫shell腳本第二行、第三行。

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

set -x會(huì)在執(zhí)行每一行shell腳本時(shí),把執(zhí)行的內(nèi)容輸出來(lái)。它可以讓你看到當(dāng)前執(zhí)行的情況,里面涉及的變量也會(huì)被替換成實(shí)際的值。

set -e會(huì)在執(zhí)行出錯(cuò)時(shí)結(jié)束程序,就像其他語(yǔ)言中的“拋出異?!币粯印?/p>

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

#!/bin/sh

set -x

set -e

source mlryj.sh

echo “hello world!”

運(yùn)行結(jié)果如下:

Linux shell腳本經(jīng)驗(yàn)分享

3. shellcheck

加了set -x和set -e后,現(xiàn)在我已經(jīng)有了shell開(kāi)始的三行代碼,但是具體的業(yè)務(wù)邏輯一行都沒(méi)寫。是不是該開(kāi)始寫了?

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

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

shellcheck除了可以提醒語(yǔ)法問(wèn)題以外,還能檢查出shell腳本編寫常見(jiàn)的錯(cuò)誤代碼。相信我,使用shellcheck會(huì)給我們的shell編寫能力帶來(lái)了巨大的飛躍的。

安裝方法如下圖:

Linux shell腳本經(jīng)驗(yàn)分享

安裝完成后可以通過(guò)shellcheck -V查看當(dāng)前安裝成功的版本號(hào)。如下圖:

Linux shell腳本經(jīng)驗(yàn)分享

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

4. 注意local

首先我們來(lái)看一下下面兩段代碼及運(yùn)行結(jié)果,代碼段1:

#!/bin/bash

set -x

set -e

function wgytest()

{

a=$1

echo a

}

wgytest shell

echo “hello world!”

echo $a

運(yùn)行結(jié)果如下圖所示:

Linux shell腳本經(jīng)驗(yàn)分享

代碼段2:

#!/bin/bash

set -x

set -e

function wgytest()

{

local a=$1

echo a

}

wgytest shell

echo “hello world!”

echo $a

運(yùn)行結(jié)果如下圖所示:

Linux shell腳本經(jīng)驗(yàn)分享

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

這是因?yàn)樵赽ash,如果不加local限定詞,變量默認(rèn)都是全局的。在頂級(jí)作用域里,是否是全局變量并不重要。但是在函數(shù)里面,聲明一個(gè)全局變量可能會(huì)污染到其他作用域,尤其在你根本沒(méi)有注意到這一點(diǎn)的情況下。當(dāng)我們開(kāi)始把重復(fù)的邏輯提煉成函數(shù),這時(shí)就有可能會(huì)掉到bash的這一個(gè)坑里。所以,對(duì)于在函數(shù)內(nèi)聲明的變量,小編的建議是記得加上local限定詞。

5. 寫在最后

以上幾條都是具體的建議,這條來(lái)點(diǎn)虛的。

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11761

    瀏覽量

    219071
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    375

    瀏覽量

    25396
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux Shell文本處理神器合集:15個(gè)工具+實(shí)戰(zhàn)例子,效率直接翻倍

    Linux 系統(tǒng)中,文本是數(shù)據(jù)交互的 “通用語(yǔ)言”—— 日志文件、配置文件、數(shù)據(jù)報(bào)表、程序輸出幾乎都以文本形式存在。手動(dòng)編輯文本不僅繁瑣,還容易出錯(cuò),而掌握 Shell 文本處理工具,能讓你用幾行命令完成批量篩選、數(shù)據(jù)提取、統(tǒng)計(jì)分析,甚至復(fù)雜的文本清洗。
    的頭像 發(fā)表于 02-03 15:42 ?1557次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>Shell</b>文本處理神器合集:15個(gè)工具+實(shí)戰(zhàn)例子,效率直接翻倍

    從小白到大牛:Linux嵌入式系統(tǒng)開(kāi)發(fā)的完整指南

    基礎(chǔ)強(qiáng)化:嵌入式開(kāi)發(fā)離不開(kāi)Linux 系統(tǒng)操作,需熟練掌握命令行(文件操作、進(jìn)程管理、權(quán)限配置)、Shell 腳本編寫、Makefile 基礎(chǔ)語(yǔ)法。建議通過(guò) “每日一個(gè) Linux
    發(fā)表于 12-16 10:42

    【瑞薩RA6E2】1.使用串口shell點(diǎn)亮LED燈

    啥技術(shù)含量,所以想來(lái)就打算實(shí)現(xiàn)一個(gè)小型的串口shell,用串口助手發(fā)指令來(lái)進(jìn)行點(diǎn)燈,這樣將串口和點(diǎn)燈融為一體,不至于單調(diào)乏味。 1,打開(kāi)原理圖 發(fā)現(xiàn)led1和led2分別如上圖,打開(kāi)rasmart軟件
    發(fā)表于 11-09 17:26

    【EASY EAI Nano-TB(RV1126B)開(kāi)發(fā)板試用】命令行功能測(cè)試-shell腳本進(jìn)行IO控制-紅綠燈項(xiàng)目-實(shí)現(xiàn)開(kāi)機(jī)起動(dòng)

    0接上文【EASY EAI Nano-TB(RV1126B)開(kāi)發(fā)板試用】命令行功能測(cè)試-shell腳本進(jìn)行IO控制-紅綠燈項(xiàng)目 Linux 起動(dòng)系統(tǒng)下 init 系統(tǒng)大多數(shù) Linux
    發(fā)表于 11-03 17:25

    【技術(shù)分享】正確編寫SysV Init腳本以實(shí)現(xiàn)Systemd兼容(上)

    嵌入式的ubuntu系統(tǒng)如何寫好SysVInit腳本呢?與system服務(wù)又有什么差別呢?一起隨著文章來(lái)探究吧。問(wèn)題背景許多傳統(tǒng)Linux服務(wù)仍使用SysVInit腳本(/etc/init.d
    的頭像 發(fā)表于 10-28 11:45 ?724次閱讀
    【技術(shù)分享】正確編寫SysV Init<b class='flag-5'>腳本</b>以實(shí)現(xiàn)Systemd兼容(上)

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

    Shell是什么?我們?cè)趧傞_(kāi)始接觸Linux的時(shí)候,經(jīng)常會(huì)聽(tīng)到工程師提到Shell這個(gè)詞,剛開(kāi)始不知道這是個(gè)干什么的,簡(jiǎn)單的說(shuō),它是一個(gè)應(yīng)用,接收用戶命令,調(diào)用相應(yīng)的內(nèi)核接口函數(shù)或應(yīng)用程序,并輸出
    發(fā)表于 09-28 09:05

    LuatOS腳本開(kāi)發(fā)入門:嵌入式運(yùn)行框架全解析!

    想搞懂LuatOS如何運(yùn)行Lua腳本?本文深入剖析其嵌入式運(yùn)行框架,涵蓋虛擬機(jī)加載、任務(wù)協(xié)程、系統(tǒng)初始化等關(guān)鍵環(huán)節(jié),適合初學(xué)者。 一、LuatOS 編程起步 1.1 底層固件怎么啟動(dòng) LuatOS
    的頭像 發(fā)表于 09-26 17:45 ?490次閱讀
    LuatOS<b class='flag-5'>腳本</b>開(kāi)發(fā)入門:嵌入式運(yùn)行框架全解析!

    嵌入式開(kāi)發(fā)新選擇:LuatOS腳本框架入門教程

    LuatOS正成為嵌入式開(kāi)發(fā)的新趨勢(shì)!本教程帶你從基礎(chǔ)入手,全面了解其基于Lua的腳本開(kāi)發(fā)模式與輕量級(jí)運(yùn)行框架。 一、LuatOS 編程起步 1.1 底層固件怎么啟動(dòng) LuatOS 腳本
    的頭像 發(fā)表于 09-26 17:34 ?603次閱讀
    嵌入式開(kāi)發(fā)新選擇:LuatOS<b class='flag-5'>腳本</b>框架入門教程

    Python腳本實(shí)現(xiàn)運(yùn)維工作自動(dòng)化案例

    還在為重復(fù)性運(yùn)維工作而煩惱?每天被各種告警、監(jiān)控、部署搞得焦頭爛額?作為一名有10年經(jīng)驗(yàn)的運(yùn)維老司機(jī),今天分享5個(gè)超實(shí)用的Python自動(dòng)化腳本,讓你的運(yùn)維工作效率提升300%!這些都是我在生產(chǎn)環(huán)境中實(shí)際使用的案例,代碼簡(jiǎn)潔高效,拿來(lái)即用!
    的頭像 發(fā)表于 08-27 14:46 ?1177次閱讀

    Linux服務(wù)器性能調(diào)優(yōu)的核心技巧和實(shí)戰(zhàn)經(jīng)驗(yàn)

    如果你正在為這些問(wèn)題頭疼,那么這篇文章就是為你準(zhǔn)備的!作為一名擁有10年經(jīng)驗(yàn)的運(yùn)維工程師,我將毫無(wú)保留地分享Linux服務(wù)器性能調(diào)優(yōu)的核心技巧和實(shí)戰(zhàn)經(jīng)驗(yàn)
    的頭像 發(fā)表于 08-27 14:36 ?1059次閱讀

    Linux系統(tǒng)性能優(yōu)化技巧

    經(jīng)過(guò)10年一線運(yùn)維經(jīng)驗(yàn),我發(fā)現(xiàn)大多數(shù)工程師只掌握了Linux優(yōu)化的冰山一角。今天分享的這些秘技,能讓你的系統(tǒng)性能提升200%以上!
    的頭像 發(fā)表于 08-27 14:34 ?979次閱讀

    Shell腳本入門指南

    Shell 是一塊包裹著系統(tǒng)核心的殼,處于操作系統(tǒng)的最外層,與用戶直接對(duì)話,把用戶的輸入, 解釋給操作系統(tǒng),然后處理操作系統(tǒng)的輸出結(jié)果,輸出到屏幕給與用戶看到結(jié)果。
    的頭像 發(fā)表于 06-03 10:47 ?1212次閱讀
    <b class='flag-5'>Shell</b><b class='flag-5'>腳本</b>入門指南

    詳解Linux系統(tǒng)中的服務(wù)管理

    Linux中,無(wú)論何時(shí)當(dāng)你安裝任何帶有服務(wù)和守護(hù)進(jìn)程的包,系統(tǒng)默認(rèn)會(huì)把這些服務(wù)的初始化及 systemd腳本添加進(jìn)去,不過(guò)此時(shí)它們并沒(méi)有被啟用。
    的頭像 發(fā)表于 05-23 15:10 ?836次閱讀
    詳解<b class='flag-5'>Linux</b>系統(tǒng)中的服務(wù)管理

    【米爾-RK3562開(kāi)發(fā)板試用評(píng)測(cè)】命令行功能測(cè)試-shell腳本進(jìn)行IO控制-(綠色)RUN 燈、(紅色)User燈

    在板上使用shell腳本語(yǔ)言簡(jiǎn)單明了開(kāi)發(fā)效率高便于調(diào)試修改動(dòng)態(tài)性強(qiáng)資源利用靈活但實(shí)時(shí)性不足。 shell腳本linux中殼層與命
    發(fā)表于 05-09 18:19

    樹(shù)莓派新手必看!在樹(shù)莓派上編寫和運(yùn)行 Shell 腳本!

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