Shell学习笔记
好早就想学习Shell,奈何太懒,想学的又太多,像Java,C++,QT...今天起,每天晚上都学点Shell编程,把学习的都写下来,当作记录,也算是督促自己的一种方法。
Shell的基本元素
Shell脚本一般第一行为 #! /bin/sh ,为什么呢?大致是,当Shell要求内核执行时,会返回不可执行的信息(因为是脚本程序),Shell捕捉到该信息后,会启动一个Shell副本来执行它,那是启动哪一个Shell呢,这就是 #! /bin/sh 的作用了。比如csh: #! /bin/csh -f , awk程序: #! /bin/awk -f (后边会学到awk),一个简单的Shell程序(除了此例,别的都省略写):
#! /bin/sh who | wc -l
Linux下的命令,以;分隔(和C语言类似),依次执行。如 a;b 即a执行后执行b,而 a&b ,是a命令在后台执行,同时执行b命令。Shell识别3种形式的命令:1.系统内建命令,如:cd,echo等;2.由1构成的Shell脚本;3.将2形成的脚本放在环境变量路径下,直接打命令就可执行。给LInux环境变量增加地址:
cd mkdir bin PATH=$PATH:$HOME/bin
Shell下的变量
Shell下的变量,不需要声明(默认是字符串?),比如:
var=HelloWorld echo $var
显示结果是:HelloWorld。赋值过程有空格,就需要加上引号了:
var1="Hello World" var2="ni hao" var="$var1 $var2" echo $var
echo也能用于输出
echo test echo
输出:test echo,接在echo行后面的字符,都会输出,输出结束后自动换行,echo -n 则不换行。
\b 退格 \r 回车
\t 制表符 \n 换行
printf的输出,与C语言下的类似
printf "Hello World %s,%s" ni hao
输出:Hello World ni,hao
基本的I/O重定向
< 文件读入数据,>输入到文件,>> 输出到文件末尾后。
tr -d '\r' < a.txt > b.txt
代码从左往右执行,删除a.txt种的回车键,输出到b.txt中。管道|:左边的输出当作右边的输入。
Linux下有两个特殊的文件:/dev/null和/dev/tty。/dev/null用来获得命令的运行结果,比如一个文件是否包含某个字符串,用grep命令,又不许要查找的结果,就可以把输出的结果指向/dev/null;/dev/tty当被程序打开时,会自动重定向到一个终端(一个实体控制台,串行端口等),不理解看下边的代码
printf "Enter new password:" stty -echo //关闭自动打印输入字符的功能 read pass < /dev/tty printf "Enter again" read pass2 < /dev/tty stty echo //恢复功能
访问参数和执行追踪
执行一个Shell脚本,传参是必须的有时候。比如
echo first arg is $1 echo second arg is ${10}
第10个参数开始,需要加{}。执行语句是 ./shellName arg.
执行追踪,类似Debug,单个显示执行的语句和信息。
#! /bin/sh set -x echo 1st echo set +x echo 2nd echo
set -x 打开debug功能,这句话不会显示出来。set +x 关闭功能,显示出这句话后,debug功能关闭。
这篇Blog,基本是边看书边记录下来的,零零碎碎地写了这么多,发现看书的效率不高,因为要边看,边总结,边写,想想这样也不怎么好,先认真地看一遍,笔记都记下来了,第二遍看的时候,就可以写写博客了。这样,提高了效率,也使文章不会这么凌乱,呵呵。