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

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

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

10種一些不太知名的bash功能你知道嗎?

馬哥Linux運維 ? 來源:未知 ? 作者:易水寒 ? 2018-06-18 15:17 ? 次閱讀

簡介

我之前的一篇文章比我預(yù)想的更受歡迎,因此我想再寫一篇文章來介紹一些不太知名的bash功能

正如之前所言,由于我覺得bash是一種要經(jīng)常使用(且需理解)的技術(shù),所以我在研究bash時寫了一本書。雖然許多人并不熟悉bash,但我覺得他們也認為非常重要便足夠令人欣喜。

10種一些不太知名的bash功能你知道嗎?

1)^x^y^

我總在使用的一個小技巧。

從來沒有輸入過類似的命令?

$ grp somestring somefile-bash: grp: command not found

哎,這個命令敲錯了,所以你要敲“↑”,然后敲”←“直到”p“,然后輸入”e"再執(zhí)行。

或者這樣輸入:

$ ^rp^rep^grep 'somestring' somefile$

你可能需要注意的一個細節(jié)是:

$ grp rp somefile$ ^rp^rep^$ grep rp somefile

如果你想搜索“rep”,那你就要深入研究man page,學會使用這個更強大的命令:

$ grp rp somefile$ !!:gs/rp/repgrep rep somefile$

我不會在這里解釋這個用法。。。

2)pushd/popd

這個在腳本中非常好用,特別是在循環(huán)中

如下所示,假設(shè)你正在寫一個進入退出文件夾的for循環(huán):

for d1 in $(ls -d */)do # Store original working directory. original_wd="$(pwd)" cd "$d1" for d2 in $(ls -d */) do pushd "$d2" # Do something popd done # Return to original working directory cd "${original_wd}"done

你可以像這樣使用pushd棧來重寫上方代碼:

for d1 in $(ls -d *)do pushd "$d1" for d2 in $(ls -d */) do pushd "$d2" # Do something popd done popddone

它可以追蹤記錄你切換的目錄并進行入?;虺鰲?/p>

注意,當使用pushd出現(xiàn)錯誤時,可能會丟失棧的記錄并且popd多次。因此你可能會想要在腳本中使用set -e(見上一篇文章)

當然也可以用cd -,但是它不會使用?!獌H僅返回前一個目錄

cd ~cd /tmpcd blahcd - # Back to /tmpcd - # Back to 'blah'cd - # Back to /tmpcd - # Back to 'blah' ...

3) shopt vs set

這兩個命令困擾了我一陣子。

兩者之間有什么不同呢?

set在之前的文章已經(jīng)介紹過了,而shopt看起來與之相似。只輸入shopt會顯示一系列選項:

$ shoptcdable_vars offcdspell oncheckhash offcheckwinsize oncmdhist oncompat31 offdotglob off

我在這里(here)找到了一些答案。

從根本上說,似乎有一系列的bash(和其他shells)建立在sh之上,而添加shopt命令則為設(shè)置額外的shell選項提供了一種方式

但是我也不確定……如果你知道為什么,請告訴我。

4)Here Docs 與 Here Strings

“Here Docs”是在shell中用一些語句創(chuàng)建的文件。

“訣竅”很簡單。定義一個用于結(jié)束的單詞,則在這個單詞單獨出現(xiàn)在一行之前的所有輸入行將構(gòu)成文件。

像這樣:

$ cat > afile << SOMEENDSTRING> here is a doc> it has three lines> SOMEENDSTRING alone on a line will save the doc> SOMEENDSTRING$ cat afilehere is a docit has three linesSOMEENDSTRING alone on a line will save the doc$

注意:

· 如果結(jié)束單詞不是“單獨”出現(xiàn)在一行中,那它可以構(gòu)成文件

· SOMEENDSTRING通常是END,但這僅僅只是習慣

更鮮為人知的是“here string”:

$ cat > asd <<< 'This file has one line'

5)字符串變量的操作

以前你可能是像下面展示的那樣寫代碼,用sed一類的工具來操作字符串:

$ VAR='HEADERMy voice is my passwordFOOTER'$ PASS="$(echo $VAR | sed 's/^HEADER(.*)FOOTER/1/')"$ echo $PASS

但是你可能不知道bash本身也是可以的。

這意味著你可以省去大量的sed和awk。

一種重寫上述代碼的方式如下所示:

$ VAR='HEADERMy voice is my passwordFOOTER'$ PASS="${VAR#HEADER}"$ PASS="${PASS%FOOTER}"$ echo $PASS

·#表示“從字符串開頭開始匹配并刪除所給的模式串”

·%表示“從字符串結(jié)尾開始匹配并刪除所給的模式串”

在我的電腦上,后一種方法比前一種快兩倍。并且(令我吃驚的是),他的速度跟類似功能的python腳本速度大致相當

如果你想使用通配符(見前文)模式串并采用貪婪模式,你需要雙寫:

$ VAR='HEADERMy voice is my passwordFOOTER'$ echo ${VAR##HEADER*}$ echo ${VAR%%*FOOTER}

6)變量的默認值

這些對寫腳本來說非常好用。

如果你有一個沒有賦值的變量,你可以像這樣給它“賦默認值”

創(chuàng)建一個default.sh文件,寫入如下內(nèi)容:

#!/bin/bashFIRST_ARG="${1:-no_first_arg}"SECOND_ARG="${2:-no_second_arg}"THIRD_ARG="${3:-no_third_arg}"echo ${FIRST_ARG}echo ${SECOND_ARG}echo ${THIRD_ARG}

現(xiàn)在執(zhí)行chmod +x default.sh并用./default.sh first second來運行腳本:

觀察第三個參數(shù)的默認值是如何被分配的,而不是前兩個。

你也可以直接用${VAR:=defaultval}(等號,不是破折號),但是注意這不適用于腳本或函數(shù)中的位置變量。嘗試修改上面的腳本來看它是如何失敗的。

7)Traps

當一個信號被送到腳本時,內(nèi)建的trap可以用于“捕獲”

下面是我用在自己的chepci腳本中的一個例子:

function cleanup() { rm -rf "${BUILD_DIR}" rm -f "${LOCK_FILE}" # get rid of /tmp detritus, leaving anything accessed 2 days ago+ find "${BUILD_DIR_BASE}"/* -type d -atime +1 | rm -rf echo "cleanup done" } trap cleanup TERM INT QUIT

任何使用TERM信號的CTRL-C,CTRL-或終止程序的操作將會首先調(diào)用cleanup

注意:

·trap的邏輯可能非常棘手(例如處理信號競爭條件)

·KILL信號不能以這種方式捕獲

但是大多數(shù)情況下,我會把它用于類似上述的‘cleanup’中,來達成函數(shù)的目的。

8)Shell變量

了解可用的標準shell變量是非常值得的。這些是我最喜歡的。

RANDOM

不要依賴這個來加密堆棧,但你可以生成隨機數(shù)字,例如在腳本中創(chuàng)建臨時文件時:

$ echo ${RANDOM}16313$ # Not enough digits?$ echo ${RANDOM}${RANDOM}113610703$ NEWFILE=/tmp/newfile_${RANDOM}$ touch $NEWFILE

REPLY

不在需要給read一個變量名稱

$ readmy input$ echo ${REPLY}

LINENO 與 SECONDS

方便調(diào)試

$ echo ${LINENO}115$ echo ${SECONDS}; sleep 1; echo ${SECONDS}; echo $LINENO174380174381116

注意,即便使用;來隔開命令,上面的代碼也要分兩行

TMOUT

可以用來超時讀取,在一些腳本中真的很好用

#!/bin/bashTMOUT=5echo You have 5 seconds to respond...readecho ${REPLY:-noreply}

9) Extglobs

如果你真的沉迷bash不能自拔,那么你可能想要增強你的通配功能。你可以通過設(shè)置shell中的extglob選項。這是設(shè)置方法:

shopt -s extglobA="12345678901234567890"B=" ${A} "

現(xiàn)在來看看你是否能指出以下這些語句各自的功能:

echo "B |${B}|"echo "B#+( ) |${B#+( )}|"echo "B#?( ) |${B#?( )}|"echo "B#*( ) |${B#*( )}|"echo "B##+( )|${B##+( )}|"echo "B##*( )|${B##*( )}|"echo "B##?( )|${B##?( )}|"

雖然它可能很有用,但是很難想象出一種你必須要用這種方式的情況。通常你會使用一些更適合相應(yīng)任務(wù)的工具(像sed)或者直接放棄bash去使用一些像python那樣的“合適的”編程語言。

10)關(guān)聯(lián)數(shù)組

談到移植到其他語言,一條重要的規(guī)則是,如果我需要用到數(shù)組,那么我會放棄bash,使用python(為此我甚至創(chuàng)建了一個Docker Container來運行一個專門的工具)

知道讀到它我才知道,在bash中有關(guān)聯(lián)數(shù)組

以下是演示:

$ declare -A MYAA=([one]=1 [two]=2 [three]=3)$ MYAA[one]="1"$ MYAA[two]="2"$ echo $MYAA$ echo ${MYAA[one]}$ MYAA[one]="1"$ WANT=two$ echo ${MYAA[$WANT]}

注意僅適用于bash4.x+版本

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

    關(guān)注

    117

    文章

    3788

    瀏覽量

    81105
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    366

    瀏覽量

    23403
  • Bash
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    10187

原文標題:有關(guān)bash,我希望我能知曉的十件事

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【每日貼日志】親愛的,知道嗎?

    ,當她被喜歡的男孩傷害時,她就會掉下眼淚,為他而流下的眼淚。 親愛的,知道嗎?有一種漂泊不叫流浪,因為有的牽掛。親愛的,
    發(fā)表于 09-29 15:18

    分享給你一些實用的Linux技巧

    并不需要知道所有的這些東西,但是如果還在很沉重地在使用Linux的話,這些東西都值得看。(注:如果你想知道下面涉及到的命令的更多的用
    發(fā)表于 08-21 17:13

    分享給你一些實用的Linux技巧

    并不需要知道所有的這些東西,但是如果還在很沉重地在使用Linux的話,這些東西都值得看。(注:如果你想知道下面涉及到的命令的更多的用
    發(fā)表于 08-29 09:43

    電池的危害有哪些,知道嗎

    電池的危害有哪些,知道嗎?,學習資料,感興趣的可以瞧瞧。
    發(fā)表于 10-26 17:00 ?0次下載

    無線充電IC知道嗎

    無線充電IC知道嗎
    發(fā)表于 01-22 19:37 ?47次下載

    MIUI的這10個小設(shè)置知道嗎

    其實在MIUI里,藏著很多個性化的選擇,接下來的這10個小設(shè)置,知道嗎?
    的頭像 發(fā)表于 05-08 16:53 ?4321次閱讀

    關(guān)于STM32的這幾個寄存器, 知道嗎

    關(guān)于STM32的這幾個寄存器,知道嗎?
    的頭像 發(fā)表于 03-06 15:19 ?1w次閱讀

    示波器的這些安全操作知道嗎?

    示波器的這些安全操作知道嗎?示波器維修。很多人都知道示波器是用來干什么的,也知道示波器都有哪些種類和品牌,當然也知道如何操作。但是,有人
    發(fā)表于 11-05 11:19 ?1699次閱讀

    每個Linux用戶都需要知道的重要Bash shell變量

    Bash 是大多數(shù) Linux 發(fā)行版的默認 shell。以下是每個 Linux 用戶都需要知道一些重要的 Bash shell 變量。
    的頭像 發(fā)表于 02-13 09:22 ?933次閱讀

    ESD模型有哪幾種知道嗎

    ESD模型有哪幾種知道嗎?
    的頭像 發(fā)表于 05-09 10:00 ?1907次閱讀
    ESD模型有哪幾種<b class='flag-5'>你</b><b class='flag-5'>知道嗎</b>?

    Python開發(fā)過哪些知名網(wǎng)站知道嗎?

    我們都知道,Python不僅在數(shù)據(jù)分析、人工智能方面有著廣泛的應(yīng)用,在網(wǎng)站開發(fā)、游戲開發(fā)方面更是枝獨秀。今天就帶大家盤點下,哪些知名的大型公司和網(wǎng)站在用Python開發(fā)。列舉
    的頭像 發(fā)表于 01-06 16:38 ?3281次閱讀
    Python開發(fā)過哪些<b class='flag-5'>知名</b>網(wǎng)站<b class='flag-5'>你</b><b class='flag-5'>知道嗎</b>?

    生產(chǎn)車規(guī)級微型體成型電感的公司知道嗎

    微型體成型電感了解多少?微型體成型電感是什么樣子的知道嗎?微型體成型電感的應(yīng)用領(lǐng)域
    的頭像 發(fā)表于 06-23 09:07 ?714次閱讀
    生產(chǎn)車規(guī)級微型<b class='flag-5'>一</b>體成型電感的公司<b class='flag-5'>你</b><b class='flag-5'>知道嗎</b>

    無源與有源器件的這些區(qū)別知道嗎?

    無源與有源器件的這些區(qū)別知道嗎?
    的頭像 發(fā)表于 10-26 15:27 ?4793次閱讀
    無源與有源器件的這些區(qū)別<b class='flag-5'>你</b>都<b class='flag-5'>知道嗎</b>?

    運算放大器的種類都有哪些?知道嗎?

    運算放大器的種類都有哪些?知道嗎?
    的頭像 發(fā)表于 12-13 15:14 ?803次閱讀
    運算放大器的種類都有哪些?<b class='flag-5'>你</b><b class='flag-5'>知道嗎</b>?

    5大高精密多層pcb的特點知道嗎

    5大高精密多層pcb的特點知道嗎
    的頭像 發(fā)表于 12-08 16:10 ?924次閱讀