Linux使用记录3

Bash Shell脚本

功能

这里写图片描述
1. Shell脚本介绍
shell是一个提供用户窗口终端接口的命令行解释器,它也可以用来运行脚本。
例如,在命令行中敲入以下命令find . -name "*.c" -ls和执行一个包含如下内容的脚本完成的功能是一样的。

#!/bin/bash
find . -name "*.c" -ls

第一行以#!开头的包含用来执行文件的命令行解释器的完整路径/bin/bash。解释器的选择取决于使用的脚本语言。
2. Command Shell Choices
常用的解释器包括
- /usr/bin/perl
- /bin/bash
- /bin/csh
- /usr/bin/python
- /bin/sh
Linux提供了很多shells,可用的shells存在/etc/shells文件中。大部分Linux用户使用默认的**bash**shell,对于一些UNIX用户可能会选择其他的shell。
3. bash 脚本
现在编写一个简单的bash脚本。有两种方式
第一种

$ cat > exscript.sh
#!/bin/bash
echo "HELLO"
echo "WORLD"

按下回车和CTRL-D保存文件。
第二种
创建文件并用编辑器编写,最后使用命令chmod +x exscript.sh添加可执行权限。(chmod +x可以让所有用户拥有执行权限)。
4. 使用bash脚本交互的例子
创建一个能够提示用户输入变量,并存储打印该变量的值的脚本。通过在变量名前加$符号可以引用变量。

#!/bin/bash
# Interactive reading of variables
echo "ENTER YOUR NAME"
read sname
# Display of variable values
echo $sname

#开头的行是作为注释存在的。
5. 返回值
所有的shell脚本在完成执行后都会生成一个返回值。返回值可以通过exit来设置。返回值允许一个进程监视另一个进程的退出状态,在父子进程中经常使用。
6. 查看返回值
在文件前命令ls,返回值存储在$?环境变量中。应用程序通常会将返回值翻译成可理解的消息提供给用户。

语法

  1. 基本语法和特殊字符
字符描述
#添加注释,除了用于脚本开始的\##!
\用于行尾,将同一条指令分成多行
;表示之后跟随的是一条新指令,同行分隔指令
$表明之后跟随的是一个变量

2. I/O重定向
>>><
3. 内置Shell指令
这里写图片描述
4. 脚本参数

参数含义
$0脚本名
$1第一个参数
$2,$3,etc第二,三个参数
$*所有参数
$#参数个数

5. 指令替代
将一条指令的结果作为另一条指令的一部分,将内部指令用()$()包括。例如:
$ cf /lib/modules/$(uname -r)/
6. 环境变量
输出$ echo $PATH
设置$ MYCOLOR=blue设置不需要$
通过env,set,printenv指令可以获取环境变量列表。
7. 导出变量
默认情况下,在脚本中创建的变量只能在该脚本的后续步骤中使用。任何子进程(sub-shells)都不能访问这些变量。要想让这些变量在子进程中使用,使用export表达式export VAR=value
VAR=value;export VAR
While child processes are allowed to modify the value of exported variables, the parent will not see any changes; exported variables are not shared, but only copied.
8. 函数
在脚本中使用函数需要两个步骤,1.声明函数2.调用函数
声明语法:

function_name (){
    command...
}

使用$1$2来获取函数参数。

结构

  1. if表达式
    压缩表示

    if TEST-COMMANDS; then CONSEQUENT-COMMANDS;fi

    更通用的定义

    if condition
    then
           statements
    else
           statements
    fi
  2. 使用if表达式

if [ -f /etc/passwd ]
then
    echo "/etc/passwd exists."
fi

使用[][[]]来表示测试条件。
3. 文件测试
bash提供了一系列可用于if表达式的文件测试条件。

条件含义
-e file检查文件存在
-d file检查文件是否为目录
-f file检查是否是常规文件(不是链接文件,设备结点,目录)
-s file检查文件大小是否非0
-g file检查文件是否有sgidset
-u file检查文件是否有suidset
-r file检查文件是否可读
-w file检查文件是否可写
-x file检查文件是否可执行

通过man 1 test命令查看完整的文件测试条件。
4. 字符串测试
使用==
5. 数字测试

操作符含义
-eq等于
-ne不等于
-gt大于
-lt小于
-ge大于等于
-le小于等于

对比语法exp1 -op exp2
6. 算术表达式
- 使用expr工具,

expr 8 + 8
echo $(expr 8 + 8)

注意要有空格
- 使用$((...))语法,这是Shell内建的格式
echo $((8+8))
- 使用内建命令let
let x=(8+8);echo $x
在现代shell脚本中,最好用var=$((...))替换expr

高级Bash脚本

字符串处理

操作符含义
[[string1 > string2]]Compares the sorting order of string1 and string2.
[[string1 == string2]]Compares the characters in string1 with the characters in string2.
myLen1=${#string1}保存字符串长度

提取字符串
${string:0:1}从0到1
${string#*.}提取所有.号后的字符

布尔表达式

&&,||,!

Case语句

case expression in
   pattern1) execute commands;;
   pattern2) execute commands;;
   pattern3) execute commands;;
   pattern4) execute commands;;
   * )       execute some default commands or nothing ;;
esac

循环结构

for variable-name in list
do
    execute one iteration for each item in the
            list until the list is finished
done
while condition is true
do
    Commands for execution
    ----
done
until condition is false
do
    Commands for execution
    ----
done

脚本调试

在**bash**shell中,以调试模式运行脚本bash -x ./script_file
- It traces and prefixes each command with the + character.
- It displays each command before executing it.
- It can debug only selected parts of a script (if desired) with:

set -x    # turns on debugging
...
set +x    # turns off debugging

重定向错误到文件和屏幕

在UNIX/Linux中,所有运行的程序都会被分配一个打开文件流。

文件流描述文件描述符
stdin标准输入,默认为键盘/终端0
stdout标准输出,默认为屏幕1
stderr表准错误输出2

使用重定向可以将stdoutstderr的输出流保存到一个或多个不同的文件中供之后分析。

一些额外的有用的技术

  1. 创建临时文件和目录
    使用touch创建临时文件容易被别人访问到。
    使用mktemp创建随机文件。
    XXXXXXXX将被mktemp工具用随机字符替换来确保文件不会被轻易访问到。
命令用途
TEMP=$(mktemp /tmp/tempfile.XXXXXXXX)创建一个临时文件
TEMPDIR=$(mktemp -d /tmp/tempdir.XXXXXXXX)创建临时目录

2. 用/dev/null丢弃输出
这里写图片描述
3. 随机数和数据
使用$RANDOM生成随机数。

进程

进程和进程属性介绍

  1. 进程类型
进程类型描述例子
交互进程Interactive Processbash,fireforx,top
批处理进程Batch Processupdatedb
守护进程Daemonshttpd,xinetd,sshd
线程gnome-terminal,firefox
内核线程kswapd0,migration,ksoftirqd

这里写图片描述
2. 进程安排和状态
running正在执行,或等待分配(时间片)来运行。
sleep等待事件发生
zombie子进程完成,而父进程没有得知这个状态。它并不存在但是仍然会出现在系统进程列表里。
3. 进程和线程ID
PID1表示init进程。

ID类型描述
PID唯一进程ID号
PPID父进程ID
TID线程ID,对于单线程进程来说就是PID。多与多线程,每个线程共享相同PID,但是有不同的TID

4. 用户和组ID
这里写图片描述
5. 优先级
这里写图片描述

列出进程

  1. ps指令(System V 风格)
    ps会列出当前shell中所有运行进程。
    ps -u列出特定用户的进程信息。
    ps -ef详细列出所有系统进程。
    ps -eLf 进一步将每一个线程列出在一行。
  2. ps指令(BSD 风格)
    ps aux列出所有用户的所有进程
    ps axo列出想要看的指定属性,如stat,priority,pid,pcpu,comm等。
  3. 进程树
    pstree列出进程树
    kill -SIGKILL <pid> or kill -9 <pid>终止进程。只能终止自己的进程,root才能终止其他用户的进程。
  4. top命令
    top可以实时地监控进程,输入q退出。
    这里写图片描述
    top命令各行内容
    1. top命令的首行展示了一个系统当前情况的概览。
      • 系统启动时间
      • 登陆用户数量
      • 平均负载load average
        平均复杂决定了系统的繁忙程度。一个CPU的负载是1.00表示满载但是没有过载。如果超过1.00表示进程在竞争CPU时间。如果平均负载非常高,可能意味着系统有问题,such as a runaway process (a process in a non-responding state)。
    2. 第二行展示了进程总数,运行,睡眠,停止,僵尸进程数量。
    3. 第三行展示了CPU时间是如何分成用户(us)和内核(uy)的。
      The percentage of user jobs running at a lower priority (niceness - ni) is then listed. Idle mode (id) should be low if the load average is high, and vice versa. The percentage of jobs waiting (wa) for I/O is listed. Interrupts include the percentage of hardware (hi) vs. software interrupts (si). Steal time (st) is generally used with virtual machines, which has some of its idle CPU time taken for other uses.
    4. 第四行和第五行展示了内存使用情况,分为物理内存(RAM)和交换空间。一旦物理内存耗尽,系统会开始使用swap空间作为外部存储池,但是访问速度会比内存慢很多,会降低系统性能。如果系统经常开始使用交换区,可以增加更多交换区空间。但是,通常先考虑增大更多的物理内存。
  5. top命令输出的进程列表
    默认情况下,进程根据最高CPU使用量排序。其他信息包括:
    • Process Identification Number (PID)
    • Process owner (USER)
    • Priority (PR) and nice values (NI)
    • Virtual (VIRT), physical (RES), and shared memory (SHR)
    • Status (S)
    • Percentage of CPU (%CPU) and memory (%MEM) used
    • Execution time (TIME+)
    • Command (COMMAND)
  6. top下的交互命令
    top运行情况下可以使用单个字母来改变行为。
命令输出
t显示或隐藏统计信息(2,3行)
m显示或隐藏内存信息(4,5行)
A按最高资源消耗排序进程
r更改指定进程优先级
k终止指定进程
f进入top配置界面
o交互式选择一个新的排序

进程指标和进程控制

  1. 平均负载
    可以通过w,top,uptime命令查看平均负载。
  2. 解释平均负载
  3. 后台和前台进程
    默认情况下进程在前台执行。在指令后面添加后缀&可以让指令在后台运行。
    使用CTRL-Z挂起一个前台进程或CTRL-C中止前台进程。使用bgfg可以让进程在后台和前台运行。
  4. 任务管理
    jobs工具可以列出当前终端下所有在后台运行的任务。显示任务ID,状态state,指令名。
    jobs -l提供相同的信息包括后台任务的PID。
    后台任务和终端窗口是联系的,所以如果log off,jobs工具家ing不会显示从该窗口启动的任务。

计划未来进程

使用at工具可以在指定时间执行指令。
这里写图片描述
1. cron
这里写图片描述
2. sleep
这里写图片描述

通用应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值