linux shell 目录
linux shell 目录
目录- linux shell 目录
- 类型
- unix支持三大主流shell
- linux支持的shell(可有四种)
- 部分相关命令
- 查询进程 ps pstree kill
- 查询用户身份 id
- 为文件创建掩码 umask
- chmod 修改文件和目录访问权限
- chown 改变文件和目录的所有者
- env 查看变量
- | 管道
- shell和信号(进程会反应)
- 信号表:
- shell主要内容
- 1. 开头(第一行)和环境说明
- 2. 注释 使用#号
- 3. 通配符
- 4. 局部变量和全局变量
- 设置全局变量
- 5. 提取变量 $name 变量修饰符
- 6. 显示输出 echo printf
- 7. 读取用户输入 read
- 8. 脚本位置参数 $* shift
- 9. 重定向符号
- shell调用选项
- 内置set命令选项
- shopt命令和选项
- shell内置命令
- 10. 数组使用
- 11. 命令替换型变量赋值
- 12. 算数运算
- 13. 运算符 大小 等于 逻辑
- 14. 条件语句 if case
- 15. 循环语句 for while until
- 16. 文件测试(和if一起使用)
- 17. 函数
- 18. 调试shell脚本
- 19. 三剑客和linux正则表达式
- 20. linux 正则表达式参考
- 21. vim编辑器使用
- 类型
参考链接
类型
unix支持三大主流shell
- Bourne shell(AT&T开发 shell),标准的unix shell,以$提示
- C shell(Berkeley分校 shell),以%提示
- Korn shell (Bourne shell的一个扩展集,AT&T的David Korn开发)
linux支持的shell(可有四种)
- GNU的shell,默认GNU bash(Bourne Again shell)
- TC shell 是unix C shell的一个兼容分支(模仿TENEX名字)
- Z shell 是linux shell的一种,综合体:结合了bash,tcsh,ksh
- 还有一种pdksh(Public Domain Korn shell),是需要向AT&T付费
查看支持/etc/shell
POSXI标准,操作系统标准,其中规范了shell和工具软件标准
执行解析顺序
- 别名
- 关键字
- 函数
- 内置命令
- 可执行程序(派生子shell执行)
? 命令的退出时子shell完成,exit返回给父shell的状态
部分相关命令
查询进程 ps pstree kill
ps -aux
pstree
kill 2564
查询用户身份 id
为文件创建掩码 umask
为文件创建掩码,可以使目录和文件默认权限减去umask值
chmod 修改文件和目录访问权限

chown 改变文件和目录的所有者
? chown 用户:组 filetest 例如 chown root:root filetest.txt
env 查看变量
env 显示环境变量(理解为全局)
| 管道
pipe | 管道两边相当于开了两个子shell,同时执行,不过一个要往管道输入东西,一个要从里面读取东西
who | wc 相当于 who > tmpfile;wc tmpfile;rm tmpfile;
shell和信号(进程会反应)
有些输入会形成信号,然后给shell,会致使shell下进程做出下面动作:
- 忽略信号
- 停止进程
- 继续进程
- 进程被程序中定义的函数捕获,进行处理
信号表:


shell主要内容
1. 开头(第一行)和环境说明
#!/bin/bash
#!为幻数
一个进程(shell)的环境包括:变量、打开的文件、当前工作目录、函数、资源限额、信号等。
使用source(.)命令可以使文件的所有设置成为当前shell的一部分。
/etc/profile 系统级初始化文件
? 找到/etc/profile.d/*文件执行
.bash_profile(三选一执行) 在用户主目录下,执行~/.bashrc,没有找下面
? ~/.bashrc,env变量被赋值为名称.bashrc,每次bash脚本,或者shell启动,都会对这个文件进行source,包含了下面设置
? set -o 打开内置选项
? set +o 关闭内置选项
? 直接set -o 查看所有当前设置

? 执行/etc/bashrc

.bash_login(三选一执行) 没有找下面
.profile(三选一执行)没有就到此为止
? 用户自定义的初始化文件

命令默认搜索路径 echo $PATH
hash命令 显示登陆会话的已执行命令完全路径名
命令分组(注意内侧空格)
? ( ls; pwd; date ) > outfile
后台执行
? man sh | lp&
进程控制(作业控制)
? [root@192 ~]# jobs -l 显示后台的作业
? [1]+ 2998 Stopped vi
? jobs %% 最后一个放进后台的
? fg %1 拿回前台
? kill 2998

历史命令history


别名
? alias cp=‘cp -i’
? unalias cp 删除别名
2. 注释 使用#号
3. 通配符
有操作含义的字符 ,在shell中不仅仅是看到的字符串
ls f{a,b,stab} 注意里面没有空格

注意此处(){}在执行命令时的区别
()开启子shell
{空格echo aa;cc=cc;} 在本shell中执行

取消了元字符功能

扩展gloabbing功能(和正则有点区别)

对于双引号,单引号处理特殊的元字符,会使其失效,就是普通字符
但是对于双引号不回禁止$变量替换 和 反引号命令替换
\ 转义单个字符,在“” ‘’ 里面也被保护,但是在“” 中碰到特殊元字符会触发保护,可解决双引号$ 和反引号问题
单双互相保护(单双也是特殊字符)

4. 局部变量和全局变量
取消变量 unset
设置变量 declare -a -f -F -i -r -x

设置全局变量
export var=aa
declare -x arr=aa

5. 提取变量 $name 变量修饰符

var2=${var:-word} var有则自己给 if var 为空,则var 为word,var为空;否则var为空,var2为var
var2=${var:+word} var则别人给
var2=${var:=word} var有则自己给 if var 为空,则var 为word,var为空;否则var为word,var2为var
var2=${var:?word} var有则自己给,否则输出word信息
var2=${var:0:4} 0为开始位置,4为长度
var2=${var:0} 0为开始位置
取消变量使用 unset var 没有$符号

${var%模式}鱼尾少不贪 使用上面的通配符匹配
echo ${var:=aaadddccdcc} echo ${var%d??} 注意完整匹配
${var%%模式}
${var#模式}
${var##模式}
/etc/aaa.txt ${var##*/} 可取出basename效果
${#var} 变量长度
6. 显示输出 echo printf
echo用法

printf 用法



7. 读取用户输入 read
read var1 var2 var3 对于其余的都会给var3
默认给REPLY


8. 脚本位置参数 $* shift
注意,$@ $*
如果是 “$@” 看成分割的"aa" "BB" "cc",此时for循环三次
如果是 “$*” 看成不分割的"aa BB cc"


9. 重定向符号
shell 启动时继承了3个文件stdin stdout stderr
来自键盘 去向屏幕 去向屏幕
1>
2>
find . -name *.c -print > foundit 2> /dev/null 双向奔赴
&> 或者 >& 一起走向
&1
&2
>>

exec和重定向


exec ls 运行后退出shell,小心
here文档和重定向输入<<


shell调用选项

内置set命令选项


shopt命令和选项


shell内置命令



10. 数组使用
数组参考链接
11. 命令替换型变量赋值
反引号 `命令`
$(命令)
12. 算数运算
求值给变量赋值
$[ exp ]
可不带空格 echo $[1+5*3]
echo \([\)v1+53] echo $[v1+53] 使用变量
$(( exp ))
echo $((1+5*3))
echo \(((\)v1+53)) echo $((v1+53)) 使用变量
declare -i var1 必须先声明,再var1=5+5/5
let 可用于整数运算和数值表达式测试
let “i+=1” ((i+=4))代替let
使用expr(待补充中)
浮点运算
echo “scale=3; 13/2”|bc
使用awk
13. 运算符 大小 等于 逻辑
14. 条件语句 if case
条件结构和流程控制
15. 循环语句 for while until
16. 文件测试(和if一起使用)
17. 函数

18. 调试shell脚本
19. 三剑客和linux正则表达式
? 三剑客参考链接
? linux正则表达式参考链接
20. linux 正则表达式参考
21. vim编辑器使用
? 参考链接