Linux Shell脚本攻略

这里是本人学习linux中整理的一些笔记归档,写的比较粗略,可做为linux常用一些目录的快速入门教程。但如果像具体点学习一个命令的所有应用,这里可能不太适合你,当然,后面又参考部分你可以进入看看详细的一些教程。enjoy it!

前言:shell基础说明

shell的使用

shell脚本规范:

1
2
#!/bin/bash
# do something

一个shell脚本的执行方法:

1
2
3
sh script.sh # 执行方式1
chmod a+x script.sh # 执行方式2
./script.sh # 会读取首行的解释器, 执行

一、shell系统基础

1.1 环境变量和变量

bash中,每个变量的值都是字符串,无论你给变量赋值时是否使用引号,值都会以字符串的形式存储

环境变量

查看所有与此终端进程相关的环境变量: env

查看某个进程的环境变量: cat /proc/$PID/environ

变量赋值:

1
2
3
4
5
6
7
8
var=value
var='the value'
var="the $PARAM"
echo $var
echo ${var}
var = value非变量赋值是相等操作

环境变量

未在当前进程中定义,而是从父进程中继承而来的变量, export 设置环境变量之后,从当前shell 执行的任何程序都会继承这个变量, 如:

export PYTHONPATH=$PYTHONPATH:/home/ken/workspace

我们linux中常用的环境变量如:

1
2
3
4
5
6
7
PATH 查找可执行文件路径, 通常定义在/etc/environment or /ect/profile or ~/.bashrc
修改: export PATH=$PATH:/new/path/
HOME
PWD
USER
UID
SHELL

识别当前shell版本:

  • echo $SHELL
  • echo $0

1.2 命令状态

当命令成功完成, 返回0

发生错误并退回, 返回非0

可以从$?中获取 cmd; echo $?

文件描述符和重定向

文件描述符: 与文件输入/输出相关联的整数, 用来跟踪已打开的文件

1
2
3
0 stdin 标准输入
1 stdout 标准输出
2 stderr 标准错误

重定向到文件:

1
2
3
4
5
6
7
清空文件写入新内容
echo "test" > temp.txt
追加
echo "test" >> temp.txt
>等价于1>
>>等价于 1>>

输出分离或合并:

1
2
3
4
5
6
7
分离
cmd 2>stderr.txt 1>stdout.txt
合并
cmd > output.txt 2>&1
or
cmd &> output.txt

扔到垃圾桶:

1
2
3
4
5
6
7
/dev/null 特殊设备文件, 接收到的任何数据都会被丢弃(位桶/黑洞)
只有标准错误
cmd 2 > /dev/null
标准输出和标准错误
cmd >/dev/null 2>&1

同时输出到终端和文件:

1
2
3
4
cmd | tee file1
tee默认覆盖,可以-a选项追加
cmd | tee -a file1

将stdin作为命令参数: cmd1 | cmd2 | cmd3 -
将文件重定向到命令: cmd < file

自定义文件描述符:

1
2
3
4
5
6
7
使用文件描述符3打开并读取文件
exec 3<input.txt
cat <&3
使用文件描述符4进行写入
exec 4>output.txt
echo newline >&4

二、字符串处理

2.1 sed简明教程

2.2 awk简明教程

2.3 输出和打印(echo & printf)

echo

基于标准输出打印一段文本

  • 忽略结尾换行符: echo -n 'test\n'
  • 对字符串进行转义: echo -e '1\t2\t3'
  • 打印彩色输出:
    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
    文字颜色码
    重置0
    黑色30
    红色31
    绿色32
    黄色33
    蓝色34
    洋红35
    青色36
    白色37
    echo -e "\e[1;31m This is red test \e[0m"
    背景颜色码
    重置0
    黑色40
    红色41
    绿色42
    黄色43
    蓝色44
    洋红45
    青色46
    白色47
    echo -e "\e[1;42m Green Background \e[0m"

printf

可以格式化字符串, 使用参数同c中printf一样

1
2
printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564
$ 3 Jeff 77.56

三、 进程管理

3.1 pgrep

获取某个进程名对应进程id 使用命令pgrep, 例如:pgrep php

四、 运算

4.1 shell数学运算

let

expr

  • echo \expr 1 + 7``
  • result=$(expr $no1 + 5)

其他运算

1
2
3
4
result=$[ no1 + no2 ]
result=$[ $no + 5 ]
result=$(( no1 + 5 ))

浮点数: bc

1
2
3
4
5
6
7
8
设定精度
echo "scale=2;3/8" | bc
进制转换
echo "obase=2;100" | bc
平方
echo "10^10" | bc
平方根
echo "sqrt(100)" | bc

五、数组:数组和关联数组

  • 普通数组,整数作为数组索引, 借助索引将多个独立的数据存储为一个集合(list)
  • 关联数组,可以使用字符串作为索引(map)

注意,在mac中的shell不能使用索引该笔记的关联数组

5.1 普通数组

1
2
3
4
5
6
7
8
9
10
11
12
13
array_var=(1 2 3 4 5) # 定义数组 方式1
array_var[0]="test1" # 定义数组 方式2
array_var[3]="test3"
echo ${array_var[0]} # 读取数组
echo ${array_var[*]} # 以清单形式打印
echo ${array_var[@]}
echo ${#array_var[*]} # 打印数组长度
echo ${!array_var[*]} # 获取索引列表

5.2 关联数组

1
2
3
4
declare -A ass_array # 先定义一个多维数组
ass_array=([index1]=value1 [index2]=value2) # 赋值:内嵌索引-值
ass_array[index3]=value3 # 独立赋值
echo ${ass_array[index1]} # 打印对应值

工具参考

crontab

crontab文件的含义:
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute hour day month week command

其中:

  • minute: 表示分钟,可以是从0到59之间的任何整数。
  • hour:表示小时,可以是从0到23之间的任何整数。
  • day:表示日期,可以是从1到31之间的任何整数。
  • month:表示月份,可以是从1到12之间的任何整数。
  • week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
  • command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符:

  • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

参考