零基础 学习Linux shell编程语法
1. shell简述
Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash
2.shell格式
#!/bin/sh
#comments 注解
Your commands go here 命令写在这
3.一些常用的逻辑运算符
&& #逻辑的 AND 的意思
|| #逻辑的 OR 的意思
== #等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串 与 == 是等价的
!= #不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
< #小于 应用于:整型比较 在[] 中,不能使用 表示字符串
> #大于 应用于:整型比较 在[] 中,不能使用 表示字符串
-eq #等于 应用于:整型比较
-ne #不等于 应用于:整型比较
-lt #小于 应用于:整型比较
-gt #大于 应用于:整型比较
-le #小于或等于 应用于:整型比较
-ge #大于或等于 应用于:整型比较
-a #双方都成立(and) 逻辑表达式 –a 逻辑表达式
-o #单方成立(or) 逻辑表达式 –o 逻辑表达式
-z #空字符串
-n #非空字符串
4.HELLO WORLD
#!/bin/sh
#print hello world in the console window
a="hello world"
echo $a
注意变量 第3行 等号号 2边 不能有空格
Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。
格式:
variable_name = variable_value
如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:
echo "Hi, $as"
就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:
echo "Hi, ${a}s"
单引号中的变量不会进行变量替换操作。(这和PHP语法是一致的)
为了证明SHELL也是弱类型语言,我们做了如下实验
a='123'
b=123
if [ "$a" -eq $b ]
thenecho 'hehe'
fi
这里是依然有输出的 hehe
5.常用的小例子
5.1 if ... else 语句
if [ expression ]
thenStatement(s) to be executed if expression is true
fi
a=10;
b=10
if [ $a == $b ]
thenecho 'haha!'
fi
a=10
b=20
if [ $a == $b ]
thenecho "a is equal to b"
elseecho "a is not equal to b"
fi
a=1
b=2
if [ $a==1 ] && [ $b==2 ]
thenecho 'suc'
elseecho 'fail'
fi
逻辑判断
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件
5.2 while循环语句
COUNTER=0
while [ $COUNTER -lt 5 ]
doCOUNTER=`expr $COUNTER + 1`echo $COUNTER
done
expr 中运算符号和参数之间要有空格分开
5.3 函数的运用
date的用法
date 用法: date [OPTION]... [+FORMAT]
time=`date +%Y-%m-%d`
echo $time
read的用法
#read 用来读取屏幕输入或是读取文件内容
#!/bin/sh
#print hello world in the console window
NAME=''
echo “Input file name:”
read NAME
echo 'your input file is:'$NAME
高级点的用法:
#!/bin/sh
FILENAME=
echo “Input file name:”
read FILENAME
if [ -c "$FILENAME" ]
then
cp $FILENAME /dev
fi
-exec的用法
对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格,同时两个{}之间没有空格
例子1:
找出距此时2天之内创建的文件,同时基于find的结果,应用-exec之后的命令,即ls -l,从而可以直接显示出find找到文件的明显列表
find . -ctime -2 -exec ls -l {} \;
例子2:
找出所有以.log结尾的文件,并删除
find . -name "*.log" -mtime -1 -exec rm -f {} \; //修改时间在一天内的
目录一定要选对哦,不然后果很严重哦,哈哈哈! 最好如果不确定的话就用rm -i吧
find . -name "*.log" -mtime -1 -type f -exec rm -f {} \;
上面那个也可能找到目录去删,所以加上type -f ,意思是 只匹配普通文件的 什么log文件啊,jpg图片啊,shell文件都属于这类
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用
find /etc -name "*.conf" | xargs ls –l #找到etc下的conf结尾文件 并列出
find / -name "*.jpg" -type f -print | xargs tar -zcvf images.tar.gz #查找所有的jpg 文件,并且压缩它
find的用法
find . –mtime +n:
最后一次修改发生在n+1天以前,距离当前时间为(n+1)*24小时或者更早find . –mtime –n:
最后一次修改发生在n天以内,距离当前时间为n*24小时以内find . -ctime -n //查找最后创建时间在n天内
注意这里的 +n和-n ,+n经常用到删除一些 没用的文件。比如下面用到的删除超过30天就删除
find . –mtime +30
fidn的文件类型:
-type b/d/c/p/l/f #依次是块设备、目录、字符设备、管道、符号链接、普通文件