1. shell的理解
shell程序是文本文件,里面存放的是批量的Linux命令集合。该文件能被shell解释执行。
其一般由Linux命令、shell命令、控制语句及注释语句构成。
shell程序通过 #!/bin/bash
或 #!/bin/sh
指定用哪个程序来编译和执行脚本。
2. 变量
变量类型:根据变量的作用域,变量可分为本地变量和环境变量。
有一个是当前用户的环境变量,其所在文件为 ~/.bash_profile
export导出环境变量
source使修改的环境变量文件生效:source .bash_profile
变量赋值:等号两边不能有空格
显示变量:echo $var
或 echo ${var}
清除变量:unset var
显示所有变量:set
环境变量按照惯例需要大写
3. 位置参量
执行的脚步 + 参数 ,这个参数就是位置变量
位置变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$1~$9 | 第1个到第9个位置参量 |
${10} | 第10个位置参量 |
$# | 位置参量的个数 |
$* | 已单字符串显示所有位置参量 |
$@ | 未加双引号时与 $*含义相同,加双引号时有区别 |
$$ | 脚本运行的当前进程号 |
$! | 最后一个后台运行的进程的进程号 |
$? | 显示前面最后一个命令的退出状态,0 没有错误,非0 有错误 |
4.数组
数组定义:arr=(var1 var2 var3)
数组使用:echo ${arr[0]}
数组所有元素: echo ${arr[*]}
数组个数:echo ${#arr[*]}
5. 时间
date
man date
date +%Y-%m-%d
在脚本中的写法:
data_time=$(date)
date_time=`date`
一天前
data_time=$(date –date='1 days ago' +%Y-%m-%d)
一天后
data_time=$(date –date='1 days' +%Y-%m-%d)
6.判断
判断有两种方式:test 和 [],常用[]
注意:用判断符号[],注意[]的两端需要有空格来分割,如[ -z “$HOME” ]
a. 判断某个文件类型
例:test –e filename
表示该文件是否存在
符号 | 含义 |
---|---|
–e | 表示该文件是否存在 |
-f | 是否是文件 |
-d | 是否是目录 |
b.判断权限
例:test –r filename
是否可读
符号 | 含义 |
---|---|
-w | 是否可写 |
-x | 是否可执行 |
c.判断两个整数
符号 | 含义 |
---|---|
-eq | 两数相等 |
-ne | 两数不等 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
d.判断字符串
例:
test –z string
判断是否为空,为空,为true
test –n string
判断是否为非空,非空为true
test str1=str2
判断str1与str2是否相等,相等,为true
test str1!=str2
判断str1与str2是否不相等,不相等,为true
符号 | 含义 |
---|---|
–z | 判断是否为空,为空,为true |
–n | 判断是否为非空,非空为true |
str1=str2 | 判断str1与str2是否相等,相等,为true |
str1!=str2 | 判断str1与str2是否不相等,不相等,为true |
注意
${TEST:-${TEST_ONE}}
该语句表示,若TEST变量不存在,则执行$TEST_ONE
7. if
判断
多个条件判断时的示例:
if [ 条件判断式 ] || [ 条件判断式 ]
if [ 条件判断式 || 条件判断式 ]
if语句有三种方式,可以嵌套
方式一:
if[ 条件判断式 ];then
执行语句
fi
方式二:
if[ 条件判断式 ];then
执行语句
else
执行语句
fi
方式三:
if[ 条件判断式 ];then
执行语句
elif [ 条件判断式 ];then
执行语句
else
执行语句
fi
8.循环
循环可以通过 for 和 while
实现
a. for循环
示例1:
for var in {1..10}
do
语句
done
实例2:
for((i=0;i<10;i=i+1))
do
s=$((${s}+${i}))
done
更详细的实例:for详细用法
b.while循环
while [ 条件语句 ]
do
语句
done
9.读取文件内容
hello word
方法一:
while read item_one item_two
do
echo $item_one $item_two
done < /path/file_name
方式二:
从文件或命令中逐行读取
while read line
cat /path/file_name | while read line
do
echo $line
done