Linux与Shell

Shell

  • 定义:Hardware → Kernel → Shell,application,KDE → user
    • Shell其实是一个应用程序,是核心提供能接受用户指令(每个指令都是单独的应用程序,Shell也可称指令列)的可以呼叫其他应用程序的壳程序
Bash
  1. 系统参数获取
指令 关键字 使用
dmesg grep 配合使用
uname [-ar] 列出Linux版本信息
  • type, 查询指令是否是内建指令
  • file, 查询脚本是否能执行
option mean
-t(ype) 详细指令信息
-p(ath) 指令名为内部指令时,才会显示完整指令信息
-a(ll) 会将PATH变量中定义的所有指令(包括alias)都列出来
  1. 变量(variable)
  • 格式:y=ax

    • y 变量名,环境变量变量名大写,供别的程序使用,在设置PATH 后,用export 导入
    • ax 变量值,用单引号包裹,代表只是一般文本字符串;用双引号包裹,可嵌套变量
    • 可用 转义变量值中的特殊符号
  • 反单引号$

    • ` 反单引号(1键左边),一串指令中`XXX` 会被先执行,执行结果作为外部的输入信息。
      • ls -ld `find /home/${USER}/.zshrc`
    • 反单引号包裹字符为变量时,输出结果与$ 输出结果一样
    • 声明变量时,必须用反单引号 包裹指令再赋值给变量,否则指令会失效,只会以字符串形式输出。
  • 全局变量与局部变量

    • 全局变量 所有程序都能读取,使用
    • 局部变量 只有自己能用
    • 父程序 中的全局变量可供子程序使用,但子程序不能使用任何程序的局部变量。使用export 即可使变量变为全局变量
  • echo 变量读取

    • echo ${USER}
  • unset <变量名> 取消变量设置

  • PATH

    • PATH 变量指系统环境变量,任何一个指令或程序在linux上能否运行,都是根据程序自定义的脚本中PATH 有没有包含执行路径
    • export 关键字可以将脚本中的普通变量变成全局变量,供其他子程序调用
  • env 读取当前系统环境变量

    • env | less
  • set 读取bash中所有变量,包括系统环境变量,用户自定义变量……

  • 特殊变量

变量 含义
$ 本Shell的PID(PID是程序标识符)
? 上个执行指令结果回传值,0 正常执行,其他数字,执行错误
  • export 将自定义变量转变为环境变量,分享自己的变量设定给后来呼叫的文件或其他程序

  1. 数据流重导向/命令输出重导向
  • 使用原因
    • 终端运行程序信息输入到指定文件,不希望它干扰屏幕正常显示
    • 存储终端指令在屏幕输出的信息
    • 分别存储正确和错误信息,便于查看
名词 解释
stdin 标准输入,代码0< <<
stdout 标准输出,代码1> >>等同于1> 1>>
stderr 标准错误输出,代码2 ,2> 2>>
> 输出/输入到文件,文件不存在会自动创建
>> 叠加 输出/输入到文件,
< 将信息输入指定文件
<< 结束输入的字符,使用字符代替键盘Ctrl+d 输入结束指令,写程序用
  • Output 输出终端显示信息到指定文件

    • 将错误和正确信息输出到不同文件

    find /home -name .bashrc > /home/$USER/tmp/list_right 2> /home/$USER/tmp/list_error

    • 将错误和正确信息输出到相同文件
      • 2>&1 是将2> 错误信息通过1> 假装成正确信息输入到 right_error 中。1>&2 同理

    find /home -name .bashrc > /home/$USER/tmp/right_error 2>&1

    • 将错误的数据丢弃,终端输出正确信息
      • /dev/null 是黑洞装置,可以吃掉任何导向这里的信息

find /home -name .bashrc 2>/dev/null

  • InPut 读取键盘输入或文件内容

    • 将键盘输入内容输入到指定文件****

      • 终端输入cat > ~/tmp/catfile 后,键盘输入的信息会记录到catfile 中,按Ctrl+d 结束键盘输入
    • 将存在的文件内容输入到指定文件

      • 终端输入cat > ~/tmp/catfile < ~/.bashrc 后,会将.bashrc 文件内容写入到catfile
    • 将键盘输入内容输入到指定文件,用自定义字符结束键盘输入

      • 终端输入cat > ~/tmp/catfile << "eof" 后,键盘输入的信息会记录到catfile 中,输入eof 结束键盘输入
管线(pipe)

定义:commond1 | commond2

关键字 含义
commond1 指令为stdout类型的指令,若为stderr类型则用2>&1 转换
commond2 指令为stdin类型的指令,接收commond1 的结果然后处理
cut 取出一行信息中需要的部分,将commond1输出结果进行分解
-d 特定分隔符剪切
-f filed,获取哪部分,echo $PATH | cut -d ':' -f 2,3
-c 去除部分字符 export | cut -c 3-
grep grep [-acinv] [--color=auto] '搜寻字符串' filename
-a 将binary文件以text形式搜寻
-c count,计算查找到的次数
-i ignore,忽略大小写查找
-n number,输出行号
-v 反向选择,输出不包含查询内容的一行
-A 后紧跟数字,代表继续输出查询行后几行
-B 后紧跟数字,代表继续输出查询行前几行
sort 排序,默认是以文字字典顺序排序
-f 忽略大小写排序
-n 以数字形式排序
-b blank,忽略最前面空格部分排序
M Month,月份排序
-r reverse,反向排序
-u unique,去重复
-t 分隔符,预设是以Tab作为分隔符,自定义排序符用单引号包裹
-k 以哪个区间排序,类似cut的-f
cat /etc/passwd | sort -t ':' -k 3 -n
uniq 对排序结果去重和计数
-i 忽略大小写
-c 计数
wc 统计文本信息
-l line,多少行
-w word,多少单词
-m 多少字符
tee 双向重导向,读取的信息可同时输出到文件和文本
-a append,叠加的形式输入到文件
tr tr [options] SET1 [SET2]
删除或替换stdin的信息。xxx from stdin ,write to stdout
-d delete 删除
-s subsitute 替换
-t truncate 截断
split split [-bl] fiel PREFIX。分割大文件为小文件,指定分隔文件前导符
-b 后接分割单个文件的大小,可指定b,k,m等存储单位
-l 以行数分隔
id 查询用户的UID/GID ,非管线命令,只能接受1个参数
xargs 不支持管线命令但是可以用xargs引用将那些命令结果作为stdin即可使用管线
xargs [-0epen] commond
-0 将stdin信息中的特殊字符(`,空格等)还原成一般字符
-e EOF(end of file),当xargs 分析到这个字符串时,会停止工作
-p 在执行每个arguments时,会询问使用者。
-n 后接数字,每次commond命令执行时,将stdin结果作为几个参数给他
cut -d ':' -f 1 /etc/passwd | head -n 3| xargs -n 1 id
dmesg 列出核心信息
Source sh Script ./Script 执行脚本的区别
方式 含义
Source 使用Source,脚本中的变量会变成全局的环境变量,相当于父程序执行
sh sh或bash执行脚本,是子程序bash,而父程序bash在sleep,脚本执行完,变量就销毁

判断式

  • test check data type or compare value
  • []用在if等判断语句中作为判断符号,中括号内各字符间需要以空格分开且临近括号两侧必须与括号边界有空格符.在括号中变量用双引号包裹,常量用单引号包裹

Shell script的默认变量

  • 命令行中在脚本后添加参数,脚本程序可以通过下表方式读取参数
变量 含义
$# 代表后接的参数个数
$@ 获取所有的参数值,每个参数用独立""包裹
$* 获取所有的参数,所有参数被1组"" 包裹,参数间空格隔开
$0 获取脚本的名字
$n n可以是大于0的任意数字,类似与数组中的索引,会输出该处具体参数
shift+n 参数偏移,n为1,则偏移1位,则使用$@ 获取参数时不会取第1位,其他数字同理
原文地址:https://www.cnblogs.com/luckyCoder/p/12732744.html