Bash One-Liners Explained 译文(一)

Bash One-Liners Explained 是一系列介绍 Bash 命令技巧的文章,由国外牛人 Peteris Krumins 撰写。凭借扎实的功底和丰富的经验,作者总结了许多快速解决问题的技巧,并且每一条都只要用简洁的一行 Bash 命令就可以完成,同时每一行命令文中都给出了非常详尽的解释。

Peteris Krumins 是一位高产的博主,在他的博客上有很多非常精彩的文章,推荐大家有机会都可以去好好读一读。例如,大家耳熟能详的 Awk One-Liners ExplainedSed One-Liners Explained 等等。后者我也北曾经在博客上分享过一篇笔记

回到正题,虽然这一系列文章不难,但是还是可以从中学到很多细节的知识,相信这些肯定会对许多初学者有所帮助,所以我打算将这一系列翻译成中文,分享给大家。为了同原文保持一致,这一系列文章最终会分成以下五篇:

  1. Bash One-Liners Explained 译文(一): 文件处理
  2. Bash One-Liners Explained 译文(二): 操作字符串
  3. Bash One-Liners Explained 译文(三): 漫谈重定向
  4. Bash One-Liners Explained 译文(四): 历史命令
  5. Bash One-Liners Explained 译文(五): 命令行跳转

本系列的文章同其它系列一样,最终都可以在连载页面找到,有兴趣的同学可以随意翻翻,看看有没有一些对你有价值的文章,大家一起交流学习。

1. 清空文件内容

$ > file

这一行命令用到了输出重定向操作符>。输出重定向发生时,文件会被打开准备写入。如果此时文件不存在则先创建,存在则将其大小截取为0。这里我们并没有重定向写任何内容到文件中,所以文件依然保持为空。

如果你想替换文件的内容,或者创建一个包含指定内容的文件,可以运行下面的命令:

$ echo "some string" > file

2. 追加内容到文件

$ echo "foo bar baz" >> file

继续阅读

Shell 默认选项 himBH 的解释

SegmentFault 的问题地址: 求大大解释如下shell语句

$ echo $-
himBH

1、himBH这个结果又是什么意思?
2、看不懂,求第69行详解。多谢++

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

以下是我的回答:

1. himBH 这个结果又是什么意思?

$-记录着当前设置的shell选项,himBH是默认值,你可以通过 set 命令来设置或者取消一个选项配置。例如:

set -x

这个可以打开 shell 的调试开关,调试 shell 脚本非常有用,这个时候再检查下 $- 变量的值,可以看到多了 x 字符:

[kodango@mac] ~ 
$ echo $-
+ echo himxBH   # -x 选项设置的效果
himxBH

回到 himBH 上,我们来一个一个看这几个默认选项分别影响了 Shell 的哪些行为。

i - interactive

包含这个选项说明当前的 shell 是一个交互式的 shell,何为交互式?你输入命令,shell 解释执行后给你返回结果,我们在 Terminal 下使用的 shell 就是交互式的,所以 $- 会包含 i 字符。如果我们在一个脚本里面 echo $-,结果是不会包含 i 的。关于交互式 Shell,我之前在博客里写过一篇文章专门介绍,有兴趣的可以看看。

H - history expand

history expand 这个很多人都基本上不用,包括我也是。我们知道 Shell 会把我们执行的命令记录下来,可以通过 history 命令查看,每一行是序号 + 执行的命令。在 shell 退出时,会将这些信息保存到~/.bash_history 文件中,当然在启动时也会从该文件中加载,不信删除这个文件再打开一个终端试试。

继续阅读

Javascript DOM 笔记

HTML文档可以看成由各种 DOM 节点组成的文档树,例如:整篇文档是一个文档节点;第个标签都是一个元素节点;文本内容可以看成文本节点;标签属性是属性节点,甚至注释也是注释节点。

nodeType

元素节点的类型可以通过node.nodeType访问,例如:

document.nodeType           # 9

主要的节点类型如下所示:

Element Type Node Type
Element 1
Attribute 2
Text 3
Comment 8
Document 9

继续阅读

Browser detect 脚本分析

目前浏览器检测 (Browser detect) 一般有两种方法:

  • 基于userAgent的值的检测;
  • 基于对象的检测,即object detection;

而第一种方法,一般来说效果并不是非常理想,因为许多浏览器都允许用户更改userAgent的值,起因要追究于第一次浏览器大战(PPK on Javascript p57)。因此,这一类的检测都不是万能的,无论是基于navigator.userAgent还是navigator.vendor等,浏览器总有办法绕过这一层检测。

PPK 在他的一篇文章中提供的检测脚本其实也是基于navigator的,但是他在整个脚本的设计上非常细致,覆盖了许多细节,看了之后收获很大。首先使用了下ppk的检测脚本,博客首页右方检测浏览器的功能正是使用ppk的脚本。

例子

当时看脚本的时候还是有点迷糊,因为脑子里面对各个浏览器的userAgent内容非常模糊,其实自己就用过Firefox、Chrome、IE、Opera等几个浏览器,没试过Safari、Konqueror、iCab等等。回头看完了脚本,我就把自己电脑上有的浏览器的userAgent都看了一遍并列了出来:

Opera/9.80 (Windows NT 6.1; U; Edition IBIS; en) Presto/2.6.30 Version/10.60
Mozilla/5.0 (Windows NT 6.1; rv:2.0b8pre) Gecko/20101029 Firefox/4.0b8pre
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; AskTB5.6)

然后是脚本检测的结果分别是:

You're using Opera 9.8 on Windows !
You're using Firefox 4 on Windows !
You're using Chrome 7 on Windows !
You're using Explorer 9 on Windows !

继续阅读

简洁的 Bash Programming 技巧(三)

这是简洁的 Bash Programming 技巧系列的第三篇文章,这一系列的文章专门介绍Bash编程中一些简洁的技巧,帮助大家提高平时 Bash 编程的效率。有兴趣的同学可以回顾下之前的两篇文章(一)续篇

1. 替换语法${parameter/pattern/string}的妙用

${parameter/pattern/string}将parameter中匹配pattern的部分替换成string,例如下面的例子将字符串中的e替换成x:

$ str="three"
$ echo "${str/e/x}"   # thrxe

如果pattern部分以/开头,表示替换parameter中所有匹配的内容,例如:

$ str="three"
$ echo "${str//e/x}"  # thrxx

如果pattern部分以#开头,表示仅当parameter开始处匹配pattern的时候替换,例如:

str="three"
$ echo "${str/#e/x}" # three
$ echo "${str/#t/x}" # xhree

与此对应地是,如果pattern部分以%开头,表示仅当parameter结尾处匹配pattern的时候替换,例如:

$ str="three"
$ echo "${str/%e/x}" # threx

如果string部分为空,匹配pattern的部分被删除(替换为空),例如:

$ str="three"
$ echo "${str/h/}"  # tree

继续阅读

学习Perl笔记(一)

Perl闻名已久,这次终于下定决心好好学习一番。前两天从晓攀那里搜刮了一堆Perl的文档,不过仔细一看全是动辄三、四百页的大块头,感觉还真不适合像我这样想最短时间内能够了解这门语言的人看。我比较喜欢简短精炼的教程,比如我是通过A Byte of Python入门学习Python,通过A Byte of Vim入门学习Vim,通过Shell十三问对Shell的熟悉与理解更上一层楼的。

所幸地是,像我这样的人不在少数,我从StackOverflow网站的一个回答上找到一些教程,从中我挑了Learning Perl the Hard Way作为入门读物(从主页上下载了PDF版本,好像更新日期是2003年,不知道是不是过旧了?)。

继续阅读

学习 Linux 命令(三)

本文是学习Linux命令 (Learn linux command)系列文章的第三篇,在这里会介绍一些让大家平时都会经常用到的命令。注意,命令出现的顺序与重要程度无关。

1. ls - list directory contents

ls命令是用得比较多的一个命令,它用于列出某个目录下面的文件或者子目录及它们的属性(大小、创建时间、所属用户等信息)。

ls命令的参数比较多,这里只介绍一些实用的。

a. 通过-a选项列出目录下面的隐藏文件(即以.号开头的文件),例如:

# ls -a ~
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .cshrc .tcshrc  .viminfo

其中.和..表示当前目录与上一级目录,如果不想显示可以使用-A选项。

# ls -A ~
.bash_history  .bash_logout  .bash_profile  .bashrc .cshrc .tcshrc  .viminfo

继续阅读

Shell 编码风格

Scripting with style 是少见的一篇介绍 Shell 编码风格 的文章,相信对大多数运维人员有用,现在将译文献上。

缩进准则

我一般使用2个空格来缩进(尽管大多人使用4个空格),原因是:

  • 输入简单快速;
  • 没有输入一个Tab键,避免不同环境下显示的差异问题;
  • 缩进的效果已经足够,并且没有浪费太多的空间;

译者注:本人也是使用4个空格,如果你也与本文作者的风格不一样,下面说到2个空格的地方请自觉替换成你实际使用的空格数。个人认为,缩进只是一个个人的风格,只要不影响可读性即可。

顺便说一句,尽量不要使用Tab键,它们容易带来麻烦,我只能想到一种情况下它是有用的:here document中的缩进。
继续阅读