之前都接触的是编译型语言,突然接触shell脚本语言这种解释型语言,真是有很大的不适应感。我会逐步的记录下作为一只小菜鸟,在shell中遇到的问题和注意的地方。(具体语句和结构可以参考linux典藏大系的shell从入门到精通)
一、首先是这种解释性语言在“命令”和“赋值”之间的区别。
在命令操作符左右两端都要有“ ”空格相隔,而赋值操作符是没有空格的。这点很重要,不想gcc和g++这种编译器,会忽略空格,shell语言很依赖空格来进行区别。例如
给变量x赋值1-->x=1(没有分号),判断x是否等于1-->[ x = 1 ]。前一个赋值号‘=’两端是没有空格的。而判断符[ ]里面有空格隔开并且‘=’两边有空格隔开。
二、SHELL编程和C和C++习惯的改变
一些在C或者C++上的编程习惯,在SHELL上是必须改变的。比如之前说的空格的问题,我就非常愿意在C++上的=两边加上空格,但是在SHELL中一定要控制控制加控制。还有{}的使用,不管是if还是while,until,SHELL中这些程序块使用then、do、done等标识出来的,所以在编写SHELL脚本的时候,一定要克制克制加克制,其实写多了就好了。。。
三、各种$的应用
1、$( statement ):
a、一般来说,$()中的语句是可以执行的shell命令。就像` `(反引号不是''单引号啊,在键盘~的下面)
例如:echo "current dictionary is $(pwd)"结果会显示当前目录。
b、$()还会用来做数字运算,其实是$(())。$(())比expr好多了,不管松散还是紧凑都可以正确输出例如:
result=$((10+1))和result=$(( 10 + 1 ))都可以正确输出结果,当然类似的计算还可以用let、$[ ]。
2、${ }
这个命令是用来做变量替换的。一般$temp和${temp}是一致的,需要注意的是多个变量一起用的时候${ }来确定变量的界限
其他功能的例子:temp=/home/xcs/shell/CSDN.sh
${temp#*/}是去掉第一个/符号和它左面的字符:结果home/xcs/shell/CSDN.sh
${temp##*/}去掉最后一个/符号和它左面的字符:结果CSDN.sh
${temp%/*}去掉最后一个/符号和它后面的字符:结果/home/xcs/shell/CSDN.sh
${temp%%/*}去掉第一个/符号和它后面的字符:结果空
${temp:0:5}:提取最左边的 5 个字节:/home
${file:5:4}:从第 6 个字节开始右边的连续 5 个字节:/xcs
我们也可以对变量值里的字符串作替换:
${file/home/path}:将第一个 home 提换为 path:/path/xcs/shell/CSDN.sh
${file//home/path}:将全部 home 提换为 path:
最后${#temp}还可以测量变量的长度,echo "the length of temp is ${#temp}"回显为23