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:++ -- + - ! ~ ** * / %等等
基本上变量的相关内容就到这里了。我讲得乱七八糟的,希望大家谅解。