继作死双系统后linux学习进展感悟,及少量Shell Script吐槽

好不容易装好的linux系统终于可以开始学习啦,过一个年过了这么久,计划都已经打乱了,只能加速前进了。


看到上一篇自己的日志,装linux系统折腾了两天,只能笑笑自己之前确实太菜了,里面的命令现在我都已经可以看懂,并且完全可以自行修改安装啦,再装一次系统估计也就是半个小时的事情了。不得不感叹,强迫自己每天发奋学习的作用真的不小,自己进步的速度也是超出我自己的想象。好了,废话少说,进入到学习总结吧。


我学习所使用的教材是鸟哥的linux私房菜,是很经典的入门级教材啦,从2,.26日到今天3月11日,一共15天,学习到了第430页。平均每天30页的速度虽然不算快,但是也能让我感到骄傲了。

鸟哥私房菜分成了5个部分,在学习第一部分linux规划与安装的时候,我还看不懂man界面和info界面,看着一排排的英文命令行解释真是觉得好头疼,在这之前都是硬着头皮学习下去的,因为这个系统我感觉用起来真是太不方便了呢,好想切换回我自己的win7系统呀。总之还好我坚持下来了,然后学习到了关机命令:shutdown | reboot 感觉好屌呀,切换回windows进入CMD里试了一试,居然也有shutdown命令呢,好棒!以后可以在小伙伴面前默默的装逼了。然后我信心大增(毕竟Windows系统上也可以用是不)。学习也是越发的奋勇了。


然后,进入了第二部分,linux文件,目录与磁盘格式,这一部分怎么说呢,相对无趣吧...毕竟都是一些文件操作的命令学习,反正我照着书本每个都操作熟悉了,总之没拉下,后续的学习中还是发现这个部分很重要的,因为都是最基础的文件复制,删除,权限修改,寻找等命令。后来常常自己记得一个命令可以实现功能的,但是忘记了具体的名字或者参数了,都会回来查询。这个部分里的linux文件系统EXT2,3的讲解,让我第一次对文件系统有了真正的认识了。知道了文件在硬盘里究竟是怎样存储的,也明白了bootloader的引导是如何的实现的,总之学习这一部分之后,再也不会为了装系统这样的事情去纠结了,毕竟原理咱们都懂了是不。


然后呢,经过约一个星期的学习,总算是进入了正题 了。第一个上来学习的东西就是vi与vim编辑器了,用这个编辑器开发程序看起来还行,毕竟能自动检查语法,不过比起我大VS2010可是差多了呢。照着操作的指令学习了怎么移动,复制,粘贴,删除等等,不一会儿又忘了。。心中郁闷,打开知乎刷刷,发现vczh轮子哥居然正好回答了:“真的有人用vim开发大型项目吗?”然后果断vczh打我脸了:“一个巨硬工程师开发项目的时候,使用vs打开就死机,只能用vim了”。好吧,我还是好好学习。然后发现vim里卖弄的块选择真是个好玩的东西,可以在一段文字最后同时补上内容,这个比word好用。

学完了vim之后就开始学习bash了,学到了echo与$之后,也能写入变量了,总算是有了一点编程语言的感觉了,不过还没有for循环呢。然后鸡血看下去,有了输入read函数,declare声明,等等,还有使用数据流重定向,感觉这部分有点C++ 的感觉了,不过总感觉有点不对。

然后接着学习,学到正则表达式了,我只想说继作死双系统后linux学习进展感悟,及少量Shell Script吐槽_第1张图片,怎么bash环境里一会儿是正则表达式,一会儿是bash命令啊!!"*"一会儿代表从0到任意个字符,一会儿代表任意个前一个字符。等等等,我快崩溃了好吗?能不能统一语法啊!

吐槽完了,继续学习,printf函数与awk我也无力吐槽了,怎么会有这么难用的东西,还不如C里面的printf函数。总之好赖学完了,忘了再回去查看好了。然后学习到了shell script语法,总之心好累。。 然后发现这个shell script编程的一个很麻烦的问题。就是变量不分数据类型的。。在cC++里习惯了定义变量类型,用int 或者 string

字符串,都用的如鱼得水,来到这里 “$variable”就是一个字符串,也可以是一个数字,不过要用-gt -lt等等命令参数来比较大小,真是觉得好麻烦啊。。。不过不爽归不爽,学习还是没有拉下,课本上每一个scripts都在自己的系统里实现了,并且部分添加了一些新的功能,然后发现了一部分需要注意的经验。


首先第一点就是 [ ] 里的空格一定要留出来啊

[ "$name" == ""] # 1
[ "$name" == "" ] # 2
上面两段代码,2的 “ 号与 ] 之间留下了空格,所以是正确的,没有空格的话就是语法错误。。

同样上面代码中$name 如果没有使用""双引号括起来,那么只有当name是有值的时候是正确的,当$name 没值时,运行程序会提示你==左边没有值。。语法出错。


$( ($a + $b)) #3
$( date +%s) #4
3中的$与第一个(),一定要连起来,中间不能有空格,否则是语法错误,然后+号与左右两个数据之间可以由空格也可以没有,一般我的习惯是加上空格,看起来比较清楚。

结果到了4中,如果没有空格,+%s就是语法错误了。。

总之这样的语法错误在我最开始练习编写shell script中不知道出现了多少,真是好累啊


自己改写的新部分:

鸟哥的sh11.sh例子,用来输入一个日期,来计算剩下的退伍天数。代码里只校验了是否有8个数字,但是没有校验数字是否是多余8个的。于是我自己加上了一段:

date_num=$($date2 | wc -m) #计算字符数
if [ "$date_num" != "8" ] ; then
        echo "wrong number of numbers, you should input 8 number"; exit 1
fi
这一段用wc -m来计算输入的数字个数是否是8个,然后我运行的时候发现我输入8个数字时居然报错了,提示我输入的数字不是8个,然后想来想去也觉得不是我代码的问题,然后决定在bash里试一试这个计数的个数:
num=12345678
echo $num | wc -m

 然后上述代码的运行结果居然是9.。。我赋值明明是1到8呀。。好吧,估计是计数的方式有问题。然后百度了一下这个wc -m的问题,结果没有人提过。。看来这不是问题啊。 
  

然后想了想,可能是把这个变量当做字符串来处理的,那么会不会是把首字符^或者是结束字符$算进去了呢。然后使用下面的代码

num=12345678
echo $num | cat -A

结果是
12345678$
果然是多了一个结尾字符啊,然后把上面判断的语句改成了9,代码就正确了。



书上可能的bug,或许是我的centOS7中才出现的:

n鸟哥的sh18.sh里使用

filelist=$(ls $dir)
来获得目录下文件列表,然后使用for循环来读取每一个的文件,在for循环体里使用test命令测试文件的权限

for filename in $filelist
do
          ...
done
我照着代码敲出来的代码怎么跑都出错,提升test 命令使用了过多的参数。

我在bash环境中使用

echo $((ls $dir))
输出的结果一切正常,确实使一个文件名一个空格的形式。怎么修改文件都不正确,没办法,只有作罢。不由得又怀念起可以单步中断,跟踪内存的VS2010起来。

下一部分学习shell script 调试与追踪。使用sh -x 调试。果断拿来了跑sh18.sh的代码。

然后运行到第一个test时, 以外发现:

+test -r /home/yw 13054 $$ perm="$perm readable"
怎么莫名其妙来了一个数字?然后再运行一次,数字居然又变了。。没明白怎么回事。然后想起来之前$variable 不加”“双引号出错的问题,试着在for循环里加上了双引号

for filename in "$filelist"
然后结果就正确了。。我也没明白怎么回事。不过知道了以后能加双引号就加上好了。。。


总结一句:

不知道是我学习的太浅还是什么原因,总之这个shell script 的语法真的是让人头大啊。。。




你可能感兴趣的:(linux学习,linux,shell)