初识Bash编程

在前一篇文章里面(怎样入Bash编程的坑?),我们列出了的很多Bash的资料。这篇文章是其中一篇的整理而来,原文的地址为Bash -- Standard Shell

Bash Conditionals -- 条件语句

基本的选择

最基础的条件语句就是if了:

if something ; then
    do_stuff;
fi

fi收尾,这个千万不要忘了。

多条分支的条件语句

这个很显然了,使用elseelif来走不同的逻辑分支:

if something ; then
    do_stuff
elif something_else ; then
    do_other_stuff
elif full_moon ; then
    howl
else
    turn_into_a_newt
fi

注意,在条件语句下,每个区块中必须要有至少一行语句,即下面的写法是错误的:

if some_stuff ; then
    # A statement is required here. a blank or a comment
    # isn't enough!
else
    einfo "Not some stuff"
fi

如果你实在是没有语句可以放,可以用:来表示空语句,类似python中的pass

if some_stuff ; then
    # Do nothing
    :
else
    einfo "Not some stuff"
fi

条件检验

进行比对或者是文件的属性检验时,相关的语句需要用[]或者[[]]框起来

# is $foo zero length?
if [[ -z "${foo}" ]] ; then
    die "Please set foo"
fi

# is $foo equal to "moo"?
if [[ "${foo}" == "moo" ]] ; then
    einfo "Hello Larry"
fi

# does "${ROOT}/etc/deleteme" exist?
if [[ -f "${ROOT}/etc/deleteme" ]] ; then
    einfo "Please delete ${ROOT}/etc/readme manually!"
fi

注意一般[[]]要比[]安全一些,尽量多使用前者吧

这是因为[[]]是bash的一个语法结构,而[]中框起来的语句其实是被视为内联的。看下面这个例子:

bash$ [ -n $foo ] && [ -z $foo ] && echo "huh?"
huh?
bash$ [[ -n $foo ]] && [[ -z $foo ]] && echo "huh?"
bash$

字符串比对

一般的字符串比对形式为string1 operator string2,其中操作符可以为

Operator Purpose
==或者= 字符串相等
!= 字符串不等
< 按字典顺序小于
> 按字典顺序大于
=~ 正则匹配(Bash 3 Only)

字符串检验

通常字符串检验的形式为-operator "string",其中操作符可以为

Operator Purpose
-z 字符串长度为0
-n 字符串长度非0

注意:如果你确认一个变量被设置了而且非空,使用`-n "${BLAH}",而非"-n $BLAH",后一种情况在变量未设置时会出错。

整型数比较

通常整型数比较的形式为int1 -operator int2,可选的操作符如下:

Operator Purpose
-eq 等于
-ne 不等
-lt 小于
-le 小于或等于
-gt 大于
-ge 大于或等于

文件检验

文件检验的形式为-operator "filename",其中操作符为可以:

Operator Purpose
-a file Exists (use -e instead)
-b file Exists and is a block special file
-c file Exists and is a character special file
-d file Exists and is a directory
-e file Exists
-f file Exists and is a regular file
-g file Exists and is set-group-id
-h file Exists and is a symbolic link
-k file Exists and its sticky bit is set
-p file Exists and is a named pipe (FIFO)
-r file Exists and is readable
-s file Exists and has a size greater than zero
-t fd Descriptor fd is open and refers to a terminal
-u file Exists and its set-user-id bit is set
-w file Exists and is writable
-x file Exists and is executable
-O file Exists and is owned by the effective user id
-G file Exists and is owned by the effective group id
-L file Exists and is a symbolic link
-S file Exists and is a socket
-N file Exists and has been modified since it was last read

文件比较

文件比较的一般形式为"fille1" -operator "file2"。其中 操作符如下:

Operator Purpose
file1 -nt file2 文件1比文件2更新(根据修改日期比较),或者文件1存在而文件2不存在
file1 -ot file2 文件1比文件2更旧,或者文件1不存在而文件2存在
file1 -ef file2 file1 and file2 refer to the same device and inode numbers.

布尔运算

||或,&&与,!非。

注意:在[[]]内部,[[ ! -f file ]] && bar可以工作,而[[ -f foo && bar]]则无法正常工作,这是因为[[]]内无法运行命令。

Bash中的遍历结构

和其他的编程语言类似,遍历结构分为两种,for关键词和while关键词。

下面是一些例子的

for myvar in "the first" "the second" "and the third" ; do
    einfo "This is ${myvar}"
done

for (( i = 1 ; i <= 10 ; i++ )) ; do
    einfo "i is ${i}"
done

while hungry ; do
    eat_cookies
done

Bash中的变量操作

在bash中,关于${}结构,在一些情况下可以用来操作变量或者获取变量的信息。使用这个特性可以避免相对来说比较耗性能的(或者illegal的)sed系列指令。

获取字符串长度

${#somevar}可以用来获取字符串的长度

somevar="Hello World"
echo "${somevar} is ${#somevar} characters long"

变量的默认值

Bash中有很多的方法来为未设置或者空的变量设置一个默认值。${var:-value}这个结构,在var未设置或者为空的时候为var提供默认值value${var-value}的功能基本是相同的,但是如果var这个变量被声明了,但是为空,此时两者的表现会不同:

var=          # declared but not set
echo ${var:-default}    # var获得默认值default
var2=        # declared but not set
echo ${var2-default}      # var仍为空

${var:=value}${var=value}var没有设置值时(null)为其填充value值。冒号的作用和上面的是一样的。

${var:?message}这个命令,会在var这个变量未设置或者为空时,显示message的信息并终止程序。这里也有去掉冒号的形式${var?message}.

${var:+value}命令作用恰好想法,如果var有值了,则返回value,否则返回空字符串。

提取substring

提取substring,主要是使用到${var:offset}${var:offset:length},这两个命令。其中offset参数的作用方式和python是类似的,当offset为正数时,偏移量从左至右算,为负数时从右至左算。

Command Substitution

$(command)这个命令可以将command命令的stdout输出捕获并返回为一个字符串。

注意:\command` 也可以起到类似的作用,但是你最好还是使用$(command)`,毕竟后者更加简洁可读,也方便嵌套使用。

字符串替换

Bash中一共提供了三种字符串替换的方式: ${var#pattern}${var%pattern}${var/pattern/replacement}。前两个用来进行删除操作。

${var#pattern}命令会返回将var的,从字符串其实处开始的符合pattern的最短的子字符串删除之后余下的结果,如果没有匹配的,则返回var本身。如果要删除最长的子字符串,使用${var##pattern}

${var%pattern}类似,不过子字符串从字符串尾部算起。相应的,如果想用贪心模式,重复百分号即可${var%%pattern}

${var/pattern/replacement}可以用replacement替换第一个匹配项。如果想要替换所有的匹配项 ,就需要使用${var//pattern/replacement}

Bash的代数计算扩展

$(( expression))这个机构提供了代数计算的扩展,其中expression表达式有着类C的结构。下面是你可以采用操作符,他们的定义基本是和C语言是一样的:

Operators Effect
var++, var-- Variable post-increment, post-decrement
++var, --var Variable pre-increment, pre-decrement
-, + Unary minus and plus
!, ~ Logical negation, bitwise negation
** Exponentiation
*, /, % Multiplication, division, remainder
+, - Addition, subtraction
<<, >> Left, right bitwise shifts
<=, >=, <, > Comparison: less than or equal to, greater than or equal to, strictly less than, strictly greater than
==, != Equality, inequality
& Bitwise AND
^ Bitwise exclusive OR
| Bitwise OR
&& Logical AND
| | Logical OR
expr ? expr : expr Conditional operator
=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, | = Assignment
expr1 , expr2 Multiple statements

|

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容