0%

shell 学习

变量

1
2
3
4
5
6
7
name=lzh
names=(1 2 3 4)
echo ${name}
echo ${names}
echo $1 # 参数1
echo $@ # 所有参数
echo $* # 所有参数

字符串

1
2
3
4
5
6
str=lzh
str="lzh ${str}""haha"

echo ${#str} # 字符串长度
echo ${str:1:3} # 截取字符串从下标1开始往后面3个字符

数组

1
2
3
4
names=(1 2 3 4)
echo ${names[1]} #
echo ${names[@]} 所有数组元素
echo ${#names[@]} 数组长度

运算符

流程控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
if [[ $1 > 10]]
then
echo "参数大于10"
fi


for file in $@
do
if [[ -e ${file} ]]
then
rm -rf ${file}
else
echo "${file} not exis"
fi
done



a=100
while (($a > 0))
do
echo ${a}
done

# while循环可用于读取键盘信息
while read file
do
if [[ -e ${file} ]]
then
rm -rf ${file}
else
echo "${file} not exis"
fi
done

# 无限循环

wihle :
do
done


while true
do
done

for ((;;))

# case
name=$1
case ${name} in
1) echo 1
;;
2) echo 2
;;
3) echo 3
;;
*) echo "不在1-3"
esac

test 命令

1
2
3
4
if test -f ./env.sh
then
echo 1
fi

文件测试运算符

1
2
3
4
5
6
7
-d  文件夹
-f 文件
-r 可读
-w 可写
-x 可执行
-e 检测文件(包括目录)是否存在
-s 文件是否为空
1
2
3
4
5
6
if [[ -f ./env.sh ]]
then
echo "文件存在"
else
echo "文件不存在"
fi

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
hello(){
for name in $@
do
echo "hello ${name}"
done
}
hello $@


# 带返回值的函数

add(){
return `expr $1 + 2`
}
add 1
echo $? # 函数返回值在调用该函数后通过 $? 来获得

重定向

1
2
3
4
echo 1 > 1.md  #  以覆盖的方式重定向
echo 2 >> 2.md # 以追加的方式重定向
wc -l < 1.md # 键盘获取输入的命令会转移到文件读取内容

1
2
3
4
5
6
7
8
9
10
11
# here document 用来将输入重定向到一个交互式 Shell 脚本或程序。
wc -l << EOF
213 bd
dasf as
dasf
EOF

# 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符
# 包括空格和 tab 缩进。
# 开始的delimiter前后的空格会被忽略掉。

脚本中执行另一个脚本

1
2
. ./env.sh
source ./env.sh

需要注意路径,路径为脚本执行的时候路径

常用命令

1
2
3
4
5
6
7
8
#获取当前命令的绝对路径

basePath=$(cd `dirname $0`; pwd)
# 清空文件
> filename
echo "" >filename
: > filename
cat /dev/null > filename

grep

grep 全称为 Global Regular Expression Print

主要还是查看文档 grep --help

1
2
3
4
5
6
7
8
grep ltinyho test.md

-i 忽略大小写
-r或-R 递归查找目录
-w 查找单词
-v 匹配所有不满足的条件


ps

ps命令是Process Status的缩写

1
2
3
4
-A 或者 -e 全部进程
e 显示环境变量
f 显示程序之间的关系

netstat

1
2
3
4
5
6
7
netstat -nlput 

-n 显示网络地址
-l 监听的端口
-p pid
-u udp
-t tcp

sed (steam editor)

使用数据流重导向,不修改源文件

1
2
3
4
5
6
7
8
# 删除第3行到最后一行
nl test.md | sed '3,$d' # a新增,d删除,i插入,p打印,c取代
# 将ltinyho 替换为 haha
nl test.md | sed "s/ltinyho/haha/g" > new.md
# 打印包含 ltinyho 的行
nl test.md | sed "/ltinyho/p"
# 删除包含ltinyho 的行
nl test.md | sed "/ltinyho/d"

awk

awk工作流程是这样的:读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。
默认域分隔符是”空白键” 或 “[tab]键”.

1
2
3
4
last -n 100
#ltinyho pts/2 2.2.71.1 Wed Dec 5 21:44 still logged in
#ltinyho pts/1 1.2.71.1 Wed Dec 5 21:05 still logged in
last -n 100 | awk '{print $3}' # 打印 ip 这一列

crontab

定时任务
通过 crontab 可以在固定时间间隔执行shell script.

查看 crontab 日志

重新启动 sudo service cron restart

1
2
3
4
5
6
7
8
9
10
# m(minute) h(hour) dom(day of month) mon(month) dow(day of week)

# 每隔1分钟执行 shell,并将错误输出和标准输出重定向到log文件中,注意 2>&1 在最后
* * * * * ~/shell/echo.sh >> $HOME/log/crontab/log.log 2>&1

# 18-6时每刻执行
0,15,30,45 18-6 * * *

#
0,30 8-11 */2 * *

其他注意事项
新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
注意环境变量问题,有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。