0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

10种一些不太知名的bash功能你知道吗?

马哥Linux运维 来源:未知 作者:易水寒 2018-06-18 15:17 次阅读

简介

我之前的一篇文章比我预想的更受欢迎,因此我想再写一篇文章来介绍一些不太知名的bash功能

正如之前所言,由于我觉得bash是一种要经常使用(且需理解)的技术,所以我在研究bash时写了一本书。虽然许多人并不熟悉bash,但我觉得他们也认为非常重要便足够令人欣喜。

10种一些不太知名的bash功能你知道吗?

1)^x^y^

我总在使用的一个小技巧。

从来没有输入过类似的命令?

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

哎,这个命令敲错了,所以你要敲“↑”,然后敲”←“直到”p“,然后输入”e"再执行。

或者这样输入:

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

你可能需要注意的一个细节是:

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

如果你想搜索“rep”,那你就要深入研究man page,学会使用这个更强大的命令:

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

我不会在这里解释这个用法。。。

2)pushd/popd

这个在脚本中非常好用,特别是在循环中

如下所示,假设你正在写一个进入退出文件夹的for循环:

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

它可以追踪记录你切换的目录并进行入栈或出栈

注意,当使用pushd出现错误时,可能会丢失栈的记录并且popd多次。因此你可能会想要在脚本中使用set -e(见上一篇文章)

当然也可以用cd -,但是它不会使用栈——仅仅返回前一个目录

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

3) shopt vs set

这两个命令困扰了我一阵子。

两者之间有什么不同呢?

set在之前的文章已经介绍过了,而shopt看起来与之相似。只输入shopt会显示一系列选项:

$ shoptcdable_vars offcdspell oncheckhash offcheckwinsize oncmdhist oncompat31 offdotglob off

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

从根本上说,似乎有一系列的bash(和其他shells)建立在sh之上,而添加shopt命令则为设置额外的shell选项提供了一种方式

但是我也不确定……如果你知道为什么,请告诉我。

4)Here Docs 与 Here Strings

“Here Docs”是在shell中用一些语句创建的文件。

“诀窍”很简单。定义一个用于结束的单词,则在这个单词单独出现在一行之前的所有输入行将构成文件。

像这样:

$ 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$

注意:

· 如果结束单词不是“单独”出现在一行中,那它可以构成文件

· 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

·#表示“从字符串开头开始匹配并删除所给的模式串”

·%表示“从字符串结尾开始匹配并删除所给的模式串”

在我的电脑上,后一种方法比前一种快两倍。并且(令我吃惊的是),他的速度跟类似功能的python脚本速度大致相当

如果你想使用通配符(见前文)模式串并采用贪婪模式,你需要双写:

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

6)变量的默认值

这些对写脚本来说非常好用。

如果你有一个没有赋值的变量,你可以像这样给它“赋默认值”

创建一个default.sh文件,写入如下内容:

#!/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}

现在执行chmod +x default.sh并用./default.sh first second来运行脚本:

观察第三个参数的默认值是如何被分配的,而不是前两个。

你也可以直接用${VAR:=defaultval}(等号,不是破折号),但是注意这不适用于脚本或函数中的位置变量。尝试修改上面的脚本来看它是如何失败的。

7)Traps

当一个信号被送到脚本时,内建的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-或终止程序的操作将会首先调用cleanup

注意:

·trap的逻辑可能非常棘手(例如处理信号竞争条件)

·KILL信号不能以这种方式捕获

但是大多数情况下,我会把它用于类似上述的‘cleanup’中,来达成函数的目的。

8)Shell变量

了解可用的标准shell变量是非常值得的。这些是我最喜欢的。

RANDOM

不要依赖这个来加密堆栈,但你可以生成随机数字,例如在脚本中创建临时文件时:

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

REPLY

不在需要给read一个变量名称

$ readmy input$ echo ${REPLY}

LINENO 与 SECONDS

方便调试

$ 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不能自拔,那么你可能想要增强你的通配功能。你可以通过设置shell中的extglob选项。这是设置方法:

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

现在来看看你是否能指出以下这些语句各自的功能:

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

虽然它可能很有用,但是很难想象出一种你必须要用这种方式的情况。通常你会使用一些更适合相应任务的工具(像sed)或者直接放弃bash去使用一些像python那样的“合适的”编程语言。

10)关联数组

谈到移植到其他语言,一条重要的规则是,如果我需要用到数组,那么我会放弃bash,使用python(为此我甚至创建了一个Docker Container来运行一个专门的工具)

知道读到它我才知道,在bash中有关联数组

以下是演示:

$ 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+版本

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79540
  • Shell
    +关注

    关注

    1

    文章

    358

    浏览量

    22902
  • Bash
    +关注

    关注

    0

    文章

    57

    浏览量

    10071

原文标题:有关bash,我希望我能知晓的十件事

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Python的一些功能知道吗

    编程语言python
    小凡
    发布于 :2022年09月09日 11:32:20

    【每日贴日志】亲爱的,知道吗

    ,当她被喜欢的男孩伤害时,她就会掉下眼泪,为他而流下的眼泪。 亲爱的,知道吗?有一种漂泊不叫流浪,因为有的牵挂。亲爱的,
    发表于 09-29 15:18

    发烧友与您分享一些实用的Linux技巧

    并不需要知道所有的这些东西,但是如果还在很沉重地在使用Linux的话,这些东西都值得看。(注:如果你想知道下面涉及到的命令的更多的用
    发表于 04-09 10:23

    分享给你一些实用的Linux技巧

    并不需要知道所有的这些东西,但是如果还在很沉重地在使用Linux的话,这些东西都值得看。(注:如果你想知道下面涉及到的命令的更多的用
    发表于 08-21 17:13

    分享给你一些实用的Linux技巧

    并不需要知道所有的这些东西,但是如果还在很沉重地在使用Linux的话,这些东西都值得看。(注:如果你想知道下面涉及到的命令的更多的用
    发表于 08-29 09:43

    关于线路板的常用术语知道吗

    关于线路板的常用术语知道吗
    发表于 04-23 06:05

    使用示波器进行功率测量的7大秘诀知道吗

    使用示波器进行功率测量的7大秘诀知道吗
    发表于 05-08 09:32

    802.11n有哪些技术关键点,知道吗

    802.11n有哪些技术关键点,知道吗
    发表于 05-19 07:23

    RFID应用中的7类技术问题知道吗

    RFID应用参考架构是由哪些部分组成的?RFID应用中的7类技术问题知道吗
    发表于 05-25 06:32

    STM32的几种开发方式,知道吗

    为了容错性高一些等原因,会引入一些判断机制,相对复杂一些,但是实际上有的东西是我们用不到的,这就会造成代码执行效率会相对低一些。第二方法,
    发表于 07-06 13:38

    无线充电IC你都知道吗

    无线充电IC你都知道吗
    发表于 01-22 19:37 47次下载

    MIUI的这10个小设置你都知道吗

    其实在MIUI里,藏着很多个性化的选择,接下来的这10个小设置,你都知道吗
    的头像 发表于 05-08 16:53 4066次阅读

    每个Linux用户都需要知道的重要Bash shell变量

    Bash 是大多数 Linux 发行版的默认 shell。以下是每个 Linux 用户都需要知道一些重要的 Bash shell 变量。
    的头像 发表于 02-13 09:22 632次阅读

    Python开发过哪些知名网站你知道吗

    我们都知道,Python不仅在数据分析、人工智能方面有着广泛的应用,在网站开发、游戏开发方面更是一枝独秀。今天就带大家盘点一下,哪些知名的大型公司和网站在用Python开发。列举一些比较有名的网站
    的头像 发表于 01-06 16:38 2981次阅读
    Python开发过哪些<b class='flag-5'>知名</b>网站你<b class='flag-5'>知道吗</b>?

    pcb菲林是什么?这5个作用你知道吗

    pcb菲林是什么?这5个作用你知道吗
    的头像 发表于 11-22 11:14 2963次阅读