Home > Article > Backend Development > Summary of shell knowledge points
shell中的数组
杂项知识点
参考文献
SHELL在处理一些问题的时候有得天独厚的优势,快捷方便,学会了还可以显摆显摆,当然了,shell的语法有点坑爹,没有系统的学过,只能一点一点的积累。
今天这个是在实现一个刷新数据库数据的脚本的时候碰到的一些知识点,刷新的时候用到了正则匹配、数学运算、比较等等。
<code>arr=(1 2 3 4 5) arr=(燕睿涛 yrt lulu yanruitao) arr=('^[0-9]+$' '^yrt\.(\d+)\.log$') arr=( "燕睿涛" \ "yanruitao" \ "today is a good day!" )</code>
<code>len=${#arr[@]} #返回的是数组元素的个数 echo ${arr[0]} #数组中的第一个元素,这个和其他语言的数组类似,下表从0开始 echo ${arr[2]} #数组中的第3个元素</code>
<code>[yanruitao@boss_runtime sh]$ arr=( > "燕睿涛" > "http:\/\/www\.baidu\.com\/(\d+)\.html" > "yanruitao" > "lulu" > "yrt" > ) [yanruitao@boss_runtime sh]$ echo ${#arr[@]} 5 [yanruitao@boss_runtime sh]$ echo ${arr[1]} http:\/\/www\.baidu\.com\/(\d+)\.html [yanruitao@boss_runtime sh]$ echo ${arr[0]} 燕睿涛 [yanruitao@boss_runtime sh]$ echo ${arr[5]} [yanruitao@boss_runtime sh]$</code>
<code>#第一种(()) if((6 <8)); then echo "yes 燕睿涛"; fi #输出——yes 燕睿涛 if(($a>8)); then echo "yes 燕睿涛"; fi if(($a<=$b)); then echo "yes 燕睿涛"; fi #第二种[] [[]] if [ 2 -gt 1 ]; then echo "iforever 燕睿涛"; fi if [[ 'abc' > 'ab' ]]; then echo "iforever 燕睿涛"; fi #iforever 燕睿涛 if [[ 2 < 10 ]]; then echo "iforever 燕睿涛"; fi #无输出 if [[ 2 -lt 10 ]]; then echo "iforever 燕睿涛"; fi #iforever 燕睿涛</code>
可以看到上面这几种还是有些规律的:
<code>#看看小括号的用法,首先是在for循环里面,相当于还是数学计算 [yanruitao@boss_runtime ad]$ for((a=0;a<10;a++)) > do > echo $a > done 0 1 2 3 4 5 6 7 8 9 #对变量进行++,还是相当于数序运算 [yanruitao@boss_runtime ad]$ i=1 [yanruitao@boss_runtime ad]$ echo $i 1 [yanruitao@boss_runtime ad]$ let i++ [yanruitao@boss_runtime ad]$ echo $i 2 [yanruitao@boss_runtime ad]$ ((i++)) [yanruitao@boss_runtime ad]$ echo $i 3 #数学运算 [yanruitao@boss_runtime ad]$ echo 1+2 1+2 [yanruitao@boss_runtime ad]$ echo $((1+2)) 3 #单括号里面是一个命令组,括号中的命令将会新开一个shell顺序执行,所以这个里面相当于一个封闭的空间,里面的变量什么的不能被剩余代码使用 [yanruitao@boss_runtime ad]$ a=1 [yanruitao@boss_runtime ad]$ (a=3;echo $a) 3 [yanruitao@boss_runtime ad]$ echo $a 1 #括号中and的使用 if [[ -n "$ret" && $ret -gt 123 ]]... #[[]]双中括号中只能使用&&,不能使用-a if [ -n "$ret" -a $ret -gt 123 ]... #[]单中括号中只能使用-a,不能使用&& if(($ret)) && (($ret >123 ))... #(())双小括号使用&& </li></code>
<code>function getId() { local url=$1 #local限定了变量url的作用域只在函数里面,不然会污染全局的作用域 ereg="http:\/\/www\.baidu\.com\/\([0-9]\+\)\.html" local ret=$(expr $url : $ereg) if [[ -n "$ret" && $ret -gt 0 ]]; then #当ret为null时使用[]会报错,-n这里的双引号一定要加上,不然当$ret为null时,一直返回真 echo $ret return 0 fi return 1 } [yanruitao@boss_runtime sh]$ echo $? 0 [yanruitao@boss_runtime sh]$ getId "http://www.baidu.com/123.htl" [yanruitao@boss_runtime sh]$ echo $? 1 [yanruitao@boss_runtime sh]$ getId "http://www.baidu.com/123.html" 123 [yanruitao@boss_runtime sh]$ echo $? 0 </code>
函数的整体形式如上面的例子,这里面注意两点:
echo $?
可以查看返回值。echo
,就像ret=$(getId "http://www.baidu.com.1234.html")
,只有echo
的值会传递给ret
变量。<code>[yanruitao@boss_runtime sh]$ str="燕睿涛 lulu yrt yanruitao" [yanruitao@boss_runtime sh]$ arr=($str) #这一步将字符串转化为了数组 [yanruitao@boss_runtime sh]$ echo ${arr[*]} 燕睿涛 lulu yrt yanruitao [yanruitao@boss_runtime sh]$ echo ${#arr[@]} 4</code>
<code>[ -z STRING ] “STRING” 的长度为零则为真。 [ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。 [ -d FILE ] 如果 FILE 存在且是一个目录则为真。 [ -a FILE ] 如果 FILE 存在则为真。</code>
微信号: love_skills
越努力,越幸运!越幸运,越努力!
做上CEO不是梦
赢取白富美不是梦
屌丝逆袭不是梦
就是现在!!加油
以上就介绍了shell知识点小结,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。