Bash+Quick+Reference 笔记3

昨天收到当当网的面试通知,是测试开发工程师,主要是自动化,环境的维护和开发。我这段时间一直纠结于自己将来工作的方向是啥?一开始,公司的cto给我的定位是系统工程师,然后某些所谓不知所然的领导给我的定位是运维工程师,而一开始我进入公司做的却是我在tibco的时候所作的QA,我自己也很迷茫,也一直找不到方向自己该朝哪个方向去前进,因为公司当前的处境,我没有真实地做过运维,而且很多测试工作由于我当时的反抗,我很多测试工作业不再参与,我唯一能够感同身受增长的就是一个完善的系统交付思想,以及不断增长的linux系统知识。朋友会说让工作来决定我的方向,但是我现在的平台,出去后人家都不咬我,我拿什么筹码去让别人选择我。于是我一直在寻找,也发现了些许端倪吧。我审视下自己,审视下自己的处境。

我:说实话,现在的公司真的让人很郁闷,社保到公积金到现在都没有完全弄好,这是我大学毕业后一份正式的工作,但是结果手续都差强人意,有个同事突然生了大病,很多昂贵的医药费也只能自掏腰包。公司的办公地点位于一个小区的一层,附近还有工地施工,没有年终奖金也从来不说。但是我想说,这些我进入公司之前,我都知道,我也是带着激情来工作的,我也从来不会因为这些表面的东西而厌恶这个公司。我想说的是作为一个startup的创业公司,激情是最重要的,如果很多事情大家搞官僚化,大家不再是兄弟姐妹同一战线,如果你让你的职工丧失了激情,那么你拿什么吸引员工保持对你忠诚。在此,我也不想多说什么了,我感受到的都是自己的悲凉处境,因为我自忖是一个忍耐度极高的人,如果我都爆发了,那么这个阈值已经大大超过了我的极限。

我想在此说:如果我拿到offer,我真要走了。别了我的公司。

#######################################################################

不好意思,废话说多了,我有时候真心很简单,但是很多复杂的内容却搞得自己很难受,只要让我接触linux的东西,做什么都很高兴。下面继续吧:

continuing:

变量的引用和替换:

var{var:-value}如果变量var有值了,就用var的值,如果没有值,则使用value。

var{var:=value}如果var设置了,就用var,如果没有,表达式值为value,且设置var为value。

var{var:?value}没设置的话就提示value的错误提示信息。

var{var:+value}如果设置了就用,没设置就不用。

var{#var}:使用这个var的长度作为值。

{#*}:使用位置变量的数目同{#@}user the num of positional parameters

{var#pattern}:use the value after removing pattermn from the left.{var##pattern}同时,只不过拿掉最长的。比如var的值为10234,pattern为10,那么第一个剩下后为234.当然第二个是指var有多个10的话,就都会拿掉。

上面的两个把#换成%之后,是从右边开始拿掉

${!prefix*},${!prefix@}列出变量名字以prefix开头的比如echo ${!JAVA*}如果设置了JAVA_HOME的话就会出现。

${var:pos},${var:pos:len} ${var/pat/rep1} ${var/pat} ${var/#pat/rep1} ${var/%pat/rep1}

上面这些变量替换都比较复杂了,建议读者自行研究,也不是很难,同正则是类似的。还有一条就是:

BASH提供了一种特殊的语法使得一个变量能够指向另一个变量。例子:

great="hello,world"

friendly_message=great

echo ${!friendly_message}

hello,world

#examples:

u=up d=down blank=

echo ${u}root

echo ${u:-$d}(此处的冒号是可选的。)

echo${tmp-`date`}

echo ${blank="no data"}

echo ${blank:="no data"}(一样的效果)

blank is set but it's null ,so printed no data,set the blank to be no data

echo ${blank}

tail=${PWD##*/}(这个类似于basename)就是从左边开始,把所有同/匹配的都去掉,剩下后的。也就是basename命令所具有的作用了。

############以上这些都是针对变量的,下面讲一些针对内建的变量的###########

$# number of cmd arguments参数的个数

$- 原文是:Options currently in effect(arguments supplied on command line or to set ).The shell sets some options automatically.也就是说当你使用ls -a的时候还有默认附件除a之外的选项。执行echo $-显示himBH。这5个字符就是默认的选项。

$? 最后一条命令执行后的退出状态,一般0表示正确执行,1到126是用户自定义的,127到200多少来着(记不清了)是系统的。但是我知道127是代表command not found。

$$ 当前进程的pid

$! 最近的一个后台进程的pid。

$0 脚本的名字。或者是非脚本的话,一般返回的都是-bash。就是当前shell

$n 位置变量。1到9是不需要加brace(花括号),超过了就需要加了。${10}

$*,$@显示所有的变量值。(一个是连续的"  " ,一个是" " " " " ")

##########################################

还有很多bash的变量(不常用):

$_ BASH BASH_ARGC BASH_ARGV BASH_COMMAND BASH_EXECUTION_STRING BASH_LINENO BASH_REMATCH BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO[0] {0到5}

BASH_VERSION BASH_CWORD COMP_CWORD COMP_LINE COMP_COWORD  等等。如果你想要使用某些variable,那么你可以在.profile中定义

比如SHELL PS1 PS2 PS3 PS4 TERM TMOUT HISTCHARS TIMEFORMAT 

BASH支持one-dimensional array 一维数组

message={hi  there how are you today}

message[0]=hi message[1]=there message[2]=how

declaring arrays is not required.Any valid reference to a subscripted variable can create an array.数组的引用:

${name[i]}如果想把其中的值变为整数的话可以使用let。

${name} user element 0 of array name

${name[*]}use all elements of array name

${name[@]}same as previous

${#name[*]}use the number of elements in array name=${#name[@]}

除此之外还有很多同c语言一样的语法知识:比如\a,\n等等,在此不再赘述。

#############################

下面是设计算术运算的表达:

$(( expr )) use the value of the enclosed arithmetic expression

B#n:n是基数,B是进制。8#100表示十进制的64.

operator:++ -- + - ! ~ ** * / %等等

基本上变量的相关内容就到这里了。我讲得乱七八糟的,希望大家谅解。