语法
流控制
if
if
是流控制重要的语法,通常用于对字符串判断,对文件和变量的一些判断等。常用”[]”表示。注意shell
的if
语法有一个”坑”那就是if
与[]
之间一定要有个空格。
下面是if
语法的一个基本结构
if [ condition ];then
...
elif [ condition ];then
...
else
...
fi
举例if
经常使用的条件:
[ -f "somefile" ]: 判断是否是一个文件
[ -x "/bin/ls" ]: 判断/bin/ls是否存在,并且是否可执行
[ -n "$var" ]:判断$var是否设置
[ "$a" = "$b" ]:判断ab两个变量是否相等
通常用到逻辑判断
- -r/x/w :检测读/写/执行权限
- -f/d :检测是否为文件/目录,或文件/目录是否存在
- -ne : not equal不相等为真
- -lt: less than 小于
- -le:less equal 小于等于
- -gt: great than大于
- -ge:great equal 大于等于
练习:如何利用shell遍历一个目录
for file in `ls .`
do
if [ -d $file ];then
echo "fine dir $file"
elif [ -f $file ];then
echo "file file $file"
fi
done
管理员操作
新增用户
adduser
切换用户
su
su命令主要需要注意一点,即su - user、su user
的区别,前者会进入一个新的环境,而后者会使用现在的环境
工具
文件目录操作
cp
cp -b //同名,备份
cp -f //强制复制文件
cp -r //递归方式复制文件
参数处理
通常我们会利用管道对参数进行传递,cmd | cmd
的形式。However,我们很多时候需要对参数进行划分,比如第一个cmd
传入20个参数,但是第二个cmd每次需要2个参数。这就尴尬了。
xargs
从名字就可以看出xargs
是对参数进行处理的工具。使用方法很简单。
cmd | args
例子:
cat example.txt
1 2 3 4 5
6 7
8
cat example.txt | xargs
1 2 3 4 5 6 7 8
cat example.txt | xargs -n 2
1 2
3 4
5 6
7 8
应用:我们通常可以利用xargs来配合其他命令组成一个强有力的工具。在编写程序是我们通常为bin配备一个启动脚本,这个脚本提供start ,stop,restart命令,其中restart命令就是stop和start的组合。start命令很简单,我们可以利用xargs写stop命令。
ps -fe | grep proc_name | awk '{print $2}' | xargs kill -9
匹配问题
grep
grep是shell中的重要工具,很多时候我们都会利用grep来进行查找,过滤等操作。在这个过程中我们往往还需要一些其他的操作来辅助。比如:利用grep查看答应匹配的后面几行或者前面几行
这个命令也是相当简单:
grep -5 'pattern' inputfile#打印匹配的前后5行
grep -A 5 'pattern' inputfile#打印匹配的后5行(after)
grep -B 5 'pattern' inputfile#打印匹配的前5行(before)
grep -C 5 'pattern' inputfile#打印匹配的前后5行(context)
数值计算
shell 加法
1、使用let
a="1"
let b=$a+1
echo $b
2、使用expr
a="1"
b=`expr $a + 1`
echo $b
3、使用多个$
a="1"
b=$(($a + 1))
echo $b
文件操作
tar打包
一般来说打包和压缩是一起使用的,打包指令:
tar [-cstz|vfpPN] 文件与目录
参数:
- 表示打包还是解包
- -c : 建立一个文件(一般会用到,在打包时建立一个新文件),compress
- -x:解压缩,解打包
- -t:查看tarfile文件
以上三个参数只能存在一个
- 表示文件操作和打包过程操作
- -z : 表示具有gzip属性(利用gzip压缩和解压)一般添加后缀
.gz
- -j : 表示具有bz2属性,后缀添加
.bz2
- -v : 在压缩和解压过程中显示其中文件
- -f : 使用文档明,也就是说自己命名文档。注意:
f
后面直接跟文档名所以f
应该放在参数最后 - -p : 使用文档原来的属性
- -P : 按照绝对路径来压缩!
- -N:比后面接的日期(yyyy/mm/dd)新的文档才会被压缩
- –exclude file :不要将file压缩
- -z : 表示具有gzip属性(利用gzip压缩和解压)一般添加后缀
一般比较常用的是:
压缩
tar -cvf file.tar file //打包
tar -zcvf file.tar.gz file //gzip压缩
tar -jcvf file.tar.bz2 file //bzip2压缩
字符串操作
字符串拼接
str1=abc
str2=def
str3=${str1}${str2}
echo $str3
将字符串连续输入一个文件
今天遇到这样一个情况:需要将日志输出到文件,但是直接使用
echo "log messages" > file
会出现一个问题:每次输入都会覆盖上一次的文件,在简单的百度之后,我发现了其实很容易解决
echo "log messages" >> file