工作控制
赋予使用者操控进程执行过程的机制,称为工作控制
工作控制过程中常用到的命令有:
jobs
fg
bg
可以执行的操作有:
ctrl+z
- 暂停进程
bg
- 将进程置为后台进程
ctrl+c
- 停止进程
fg
- 将进程置为前台进程
1 2 3 4 5 6 7 8 |
工作控制中常用的操作: %%:调用现在工作 %+:同上 %-:调用前一个工作 %n(数字):将工作编号为n的进程置为前台进程来执行.等同于fg %n. %n(数字) &:将工作编号为n的进程置为后台进程去执行.等同于bg %n. %?样式:调用程序名符合样式的工作. %样式:调用程序名以样式开头的工作. |
进程替换
通过进程替换我们可以把一个进程的标准输出一次倒给许多进程作为输入,或者可以由多个进程取得输出然后倒给某个进程去处理.
comm <(sort file1) <(sort file2) #将排序的输出作为comm的输入.因为使用comm的前提是已排好序的文件.
用法:
命令 <(指令行)
通过设备文件/dev/fd/n或缓存文件,把指令行的输出倒给左方的命令.> (指令行)
通过设备文件/dev/fd/n或缓存文件,把数据提供给()中的指令行
echo <(true) #输入中介文件是谁
echo >(true)
关联数组
在关联数组中,我们可以使用任何文本作为数组索引.而在普通数组中索引只能是从0开始的整数
定义
declare -A array
赋值
1 2 |
array={[index1]=value1 [index2]=value2} array[index1]=value1 |
调用
1 2 |
${!array[*]} #列出数组的索引列表 ${!array[@]} #列出数组的索引列表 |
关于函数
- bash调用函数时不会开启新的子shell,bash会在现有的shell环境下执行该函数.
- 在执行函数期间,bash会建立一个特别的变量FUNCNAME.该变量的值为函数名称.
- 由于函数执行不会开启新shell,若要传递函数给子shell环境,可使用内置命令export命令.
- 一般情况下,将函数中的变量都定义为局部变量.将存有返回值的变量设为全局变量.函数执行完毕,通过全局变量获取执行结果.
技巧
#对文件目录不清楚的情况下,想要找出目录下所有的文件:
find (pwd) -type f#env查看所有的环境变量
#set查看所有的本地变量
进程描述字段的含义
USER
执行身份PID
进程编号%CPU
cpu资源使用率%MEM
内存使用率VSZ
进程在虚拟内存中占用的大小RSS
进程在真实内存中占用的大小TTY
控制该进程的终端STAT
进程状态START
开始时间TIME
已运行时间COMMAND
执行命令PPID
父进程号
进程状态有多种,分别用不同的代码表示.下面是STAT的代码列表:
代码 意义
D 不可中断的休眠(通常是进行I/O的进程)
R 可执行的(在执行队列中)
S 等待接受工作(休眠)
T 被跟踪或被停止
W 分页
X 死亡
Z 僵尸进程,父进程结束时没有妥善处理的子进程
< 高优先级工作
N 低优先级工作
L 已分页锁定于内存中
s 一个session leader+ 在前台的进程群组中
历史指令扩展
通过历史指令扩展可以修改/调用历史指令,快速完成与之前指令类似的操作指令.
注意:通过修改bash选项histverify的状态可以使历史指令在扩展完成时不会被立即执行.通过shopt可以修改.
常见的历史指令扩展方法:
- !n
调用编号为n的历史指令 - !-n
调用往前倒数第n个历史指令 - !!
执行前一个历史指令. - !样式
执行最近一个以样式开头的历史指令 - !?样式?
执行最近一个含有样式字符的历史指令 - ^字符串1^字符串2^
将前一个历史指令中的字符串1换成字符串2,然后执行替换后的指令. - !#
代表在命令行中到目前为止所键入的字符串. - !!:$
取得前一个命令最后一个参数 - !command:n
找出最近一个以command开头的指令的第n个参数
注意:第一个参数也可以用^来代替.即cd !ls:^等同于cd !ls:1 - !command:*
找出最近一个以command开头的指令的所有参数. - !!:3-5
找出前一个指令中介于第三到第五个字符串之间的字符串
例如 echo hs ka kw ix,其中!!:2-4就是ka kw ix - !!:s/字符串1/字符串2/
将前一个指令中的字符串1替换成字符串2,然后执行替换后的指令. - !command:s/字符串1/字符串2/
将最近一个以command开头的历史指令的字符串1替换为字符串2,然后执行. - !!:h
删除最后一个历史指令后面的文件名.
注意:如ls /home/youyou/kill,!!:h的结果是ls /home/youyou - !!:t
删除最后一个历史指令前面的目录
注意:如ls /home/youyou/kill,!!:h的结果是kill - !!:p
显示前一个历史指令但不执行.
历史指令中的符号已经他们的含义:
符号 含义
! 调用历史指令
!! 前一个指令
0 命令本身
1 第一个参数
^ 第一个参数
$ 最后一个参数
* 所有的参数
n 第n个参数
x-y 第x-y个字符串
s 替换
h 删除文件名
t 删除除文件名之外的
p 显示指令,不执行.
?? 查询样式
历史指令扩展的语法
选择历史指令:操作
选择历史指令,使用!调用,根据样式或符号匹配
操作,替换,删除,查找等
命令替换
#命令替换:将命令执行后的标准输出放入变量中.命令替换的语法有两种:
1.变量名=$(命令)
2.变量名=命令
以上方式都可以将命令的执行结果保存在变量中.
1 2 3 4 5 6 7 |
#示例一 echo '命令替换:将命令执行后的标准输出放入变量中' IFS_OLD=$IFS IFS=' ' result=$(cat /etc/passwd| head -2) echo $result IFS=$IFS_OLD |
#解释
由于IFS改为空格符,所以在变量扩展时换行字符不会被删除.
这样保持了原文件的排版方式#如果要在命令替换中执行多个指令,需要用;将指令隔开
echo "$(cd ..; pwd)"#同时变量替换中也可以在包含其他命令替换.
result=(find (pwd) -type f)
算术运算
算数运算有以下几种方法:
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 |
名称 语法 范例 算数扩展 $((算术式)) r=$((8+6)) expr expr 算术式 r=(expr '8+6') $[] $[算术式] r=$[8+6] declare declare -i 变量=算术式 declare -i r=8+6 let let 算术式 let r=8+6 bc bc 文件/stdin echo "2+3" | bc #1.语法:$((算术式)) $((${j:-8}+2)) $((g-1)) #注意:变量g不存在或为空时,默认值为0 $((var-2)) #注意:变量前最好不要加$,因为如果var不存在会报错 $((n=i<100?10:2)) #2.语法:expr 表达式 r=(expr 4 \* 8) #注意:运算符和表达式之间必须有空格隔开,使用运算符之前使用\先转义后在使用. r=(expr 2 ** 3) #注意:expr没有乘方运算. #3.语法:$[算术式] r=$[r+1] #4.语法:declare 表达式 declare -i r r=8+6 #注意:运算符和操作数时间必须紧密相连,没有空格 r=4**2 #注意:变量前没有$ r=r+2 #注意:运算符不需要转义\ #5.语法:let 算术式.let使用方法和declare相似 let "i = i + 3" #注意:操作数和运算符之间可以有空格符,但是要用""包含 #6.语法:bc 含有算式的文件/stdin.bc接收来自stdin的表达式或者从指定文件中读取算术式.是一种数学运算的高级工具. echo "3/8" | bc #注意:bc后不能直接跟算数表达式 |
Bash运算符优先级表:
优先级 说明
1 i++运算后加1,i--运算后减1
2 ++i运算前加1,--i运算前减1
3 -负号,+正号
4 !逻辑非,~按位取反
5 *乘方
6 乘法,/除法,%取余
7 +加,-减
8 <<按位左移,>>按位右移
9 <=,>=,<>不等于
10 ==相等,!=
11 &按位与
12 ^按位互斥
13 |按位或
14 &&逻辑与
15 ||逻辑或
16 条件测试?式子1:式子2
17 =.*=,/=,+=,-=,<<=,>>=,&=,^=,|=
18 ,(逗号)运算
网络重定向
和对普通文件的重定向一样,通过将http请求包重定向到tcp/udp的套接字接口文件中来向网络设备发送http请求.同时通过接收套接字接口文件中的数据来获取网络设备响应的数据.
其中,套接字接口文件为:
tcp:/dev/tcp/主机名或ip/端口
udp:/dev/udp/主机名或ip/端口
1 2 3 |
例如,向通过网络重定向访问百度主页: exec 6<>/dev/tcp/220.181.112.244/80 exec 6<>/dev/tcp/www.baidu.com/80 |
文件权限
linux系统文件系统中的三种身份
- u 自己
- g 同组的人
- o 其他人
对于每种身份每种身份对应着4种权限:
- r 可读
- w 可写
- x 可执行
- s 特殊权限
linux系统中还有三种特殊权限:
- set user id(s)
- 该文件被执行,执行者可暂时成为文件拥有者。权值为4000,设有此权限的文件其用户权限的x位会显示s.
- set group id(s)
- 该文件被执行,执行者暂时成为文件所在用户组。权值为2000,设有此权限的文件其所在组权限的x位会显示s.
- sticky bit(t)
- 该文件只能被拥有者删除.设有此权限的文件其权限序列的最后会有一个T标识
对于一个文件夹x权限的含义就不再是可执行了,而是可进入
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Linux fork&&守护进程03/30
- ♥ Linux 高性能服务器编程:高级I/O函数11/28
- ♥ Linux下修改用户密码记录08/08
- ♥ Linux 进程创建&&控制&&终止03/28
- ♥ Linux_ 命令大全 文件管理03/16
- ♥ Linux_ 命令大全 Windows System03/16