SHELL理论部分

一、学习线路如下

SHELL理论部分


二、变量

1.变量的概念

变量(variable)就是给某个信息片段所起的名字。每个变量都有一个值(value),这是由你分配给变量的内容或信息。变量值可以是空值,也就是不含任何字符。

2.变量的命名

SHELL变量名称的开头是一个字母互或下划线符号,后面可以接着任意长度的字母、数字或下划线符号。变量名称的字符长度并无限制。Shell变量可用来保存字符串值,所能保存的字符数同样没有限制。

3.变量的赋值方式

先写变量名称,紧接着'='字符,最后是新值,中间完全没有任何空格。当你想取出Shell变量的值时,需于变量名称前面加上'$'字符。当所赋值的值内含空格时,请加上引号。

4.变量分类

1.本地变量-临时变量
     用户自定义的变量,定义在脚本或者当前终端中,脚本执行完毕或终端结束变量失败。
2.环境变量-用户私有变量
     定义在用户家目录下的.bashrc或.bash_profile文件中,用户私有变量,只能本用户使用。
     查看当前用户的环境变量env
     查看当前用户的所有变量(临时变量与环境变量)set
     将当前变量变成环境变量export
3.全局变量
     所有用户都能够使用,export声明变量。
     也可以在/etc/profile /etc/bashrc下永久定义
4.内置变量
     系统变量(内置bash中的变量)shell本身已经固定好了它的名字和作用。


三、文本处理的命令

cut整数截取
语法:
    command|cut option
        -c: 以字符为单位进行分割。
        -d: 自定义分隔符,默认为制表符。\t
        -f: 与-d一起使用,指定显示哪个区域。
例:cat /etc/passwd|cut -d ":" -f1,7

tr 字符转换:替换,删除
语法:
    commands|tr 'string1' 'string2'
    tr 'string1' 'string2' < filename
    tr options 'string1' < filename
        -d 删除字符串1中所有输入字符。
        -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
            a-z 任意小写
            A-Z 任意大写
            0-9 任意数字

sort排序
sort:将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输
出。
    -u :去除重复行
    -r :降序排列,默认是升序
    -o : 将排序结果输出到文件中 类似 重定向符号>
    -n :以数字排序,默认是按字符排序
    -t :分隔符
    -k :第N列
    -b :忽略前导空格。
    -R :随机排序,每次运行的结果均不同。
    
uniq 去除连续的重复行
    -i: 忽略大小写
    -c: 统计重复行次数
    -d:只显示重复行

tee 双向输出
    -a 双向追加重定向
    例:echo 999|tee -a file1
    
paste工具用于合并文件行输出到屏幕,不会改动源文件
    -d:自定义间隔符,默认是tab,只接受一个字符
    -s:将每个文件中的所有内容按照一行输出,文件中的行与行以TAB间隔。
    
echo输出
语法:echo [-ne][字符串]
    -n 不要在最后自动换行
    -e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
    转义字符
        \a 发出警告声;
        \b 删除前一个字符;
        \c 最后不加上换行符号;
        \f 换行但光标仍旧停留在原来的位置;
        \n 换行且光标移至行首;
        \r 光标移至行首,但不换行;
        \t 插入tab;
        \v 与\f相同;
        \ 插入\字符;
        \0nnn 打印nnn(八进制)所代表的ASCII字符; 备注:数字0 不要理解成字母o
        \xNN 打印NN(十六进制)所代表的ASCII字符;
        
输出字体颜色
    echo -e “\033[30m 黑色字 \033[0m”
  echo -e “\033[31m 红色字 \033[0m”
  echo -e “\033[32m 绿色字 \033[0m”
  echo -e “\033[33m 黄色字 \033[0m”
  echo -e “\033[34m 蓝色字 \033[0m”
  echo -e “\033[35m 紫色字 \033[0m”
  echo -e “\033[36m 天蓝字 \033[0m”
  echo -e “\033[37m 白色字 \033[0m”

read默认接受键盘的输入,回车符代表输入结束
OPTIONS:
    -p打印信息
    -t限定时间
    -s不回显
    -n输入字符个数


四、SHELL字符

!:             执行历史命令 !! 执行上一条命令
$:             变量中取内容符
+ - * \ %:     对应数学运算 加 减 乘 除 取余数
&:             后台执行
;:         分号可以在shell中一行执行多个命令,命令之间用分号分割
\:             转义字符
``:         反引号 命令中执行命令 echo "today is `date +%F`"
' ':         单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不
解释变量
    " ":     双引号,脚本中出现的字符串可以用双引号引起来
通配符
    ~:         家目录 # cd ~ 代表进入⽤用户家目录
    *:         星号是shell中的通配符 匹配所有
    ?:         问号是shell中的通配符 匹配除回车以外的一个字符
    [list]: 匹配[list]中的任意单个字符
    [!list]: 匹配除list中的任意单个字符
    {string1,string2,...}: 匹配string1,string2或更多字符串
重定向
    > 覆盖输入
    >> 追加输入
    < 输出
    << 追加输出
管道命令
    |: 管道符 上一个命令的输出作为下一个命令的输入


五、正则表达式

1.正则的介绍:
     正则表达式(Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。

2.正则表达式中相应符号的解释

1)定位符
    ^        锚定开头 ^a 以a开头 默认锚定一个字符
    $        锚定结尾 a$ 以a结尾 默认锚定一个字符
    \<,\b:    锚定单词首部
    \>,\b:    锚定单词尾部

2)匹配符
    .        匹配除回车以外的任意一个字符
    ()        字符串分组
    []        定义字符类,匹配括号中的一个字符
    [^]        表示否定括号中出现字符类中的字符,取反
    \        转义字符
    |        或

3)限定符
    *        某个字符之后加星号表示该字符不出现或出现多次
    ?        表示该字符出现一次或不出现
    +        表示该字符出现一次或多次
    {n,m}    某个字符之后出现,表示该字符最少出现n次,最多m次
    {m}        正好出现了m次

3.正则表达式POSIX字符

[:alnum:] 匹配任意字母字符0-9 a-z A-Z
[:alpha:] 匹配任意字母,大写或小写
[:digit:] 数字 0-9
[:graph:] 非空字符( 非空格控制字符)
[:lower:] 小写字符a-z
[:upper:] 大写字符A-Z
[:cntrl:] 控制字符
[:print:] 非空字符( 包括空格)
[:punct:] 标点符号
[:blank:] 空格和TAB字符
[:xdigit:] 16 进制数字
[:space:] 所有空白字符( 新行、空格、制表符)


六、数组

1.生成数组
         数组名称=(元素1 元素2 元素3 ...)
2.追加数组
         数组名称[n]=value
3.一次赋多个值
         array=(var1 var2 var3 var4)
         array1=(`cat /etc/passwd`)
4.数据取值
         ${array[i]} i表示元素的索引
         使用@ 或 * 可以获取数组中的所有元素:   
         echo ${array[0]}    获取第一个元素
         echo ${array[*]}     获取数组里的所有元素
         echo ${#array[*]}     获取数组里所有元素个数
         echo ${!array[@]}     获取数组元素的索引索引
         echo ${array[@]:1:2} 访问指定的元素;1代表从索引为1的元素开始获取;2代表获取后面几个元素
    
5.关联数组
     1.声明关联数组
             declare -A asso_array1
     2.赋值
             asso_array1[linux]=one
     3.一次赋多个值
             asso_array1=([name1]=harry [name2]=jack [name3]=amy


七、if语句判断

1.赋值运算
    =
2.四则运算:
    + - * / % **
    运算命令:
        expr:
            例: expr 1 + 1
        let:
            例:let a=100/3;echo a
        $(())
            例:echo $((1+1))
        bc
            例:echo "scale=2;3+1"|bc

3.逻辑运算
    $$
    ||
    !

4.比较运算
    -eq    等于
    -gt    大于
    -lt    小于
    -ge    大于等于
    -le    小于等于
    -ne    不等于
    
    字符串比较晕眩
        ==    等于
        !=    不等于
        -n    检查字符串的长度是否大于0
        -z    检查字符串的长度的是否为0

5.文件类型及新旧判断
    -d 检查文件是否存在且为目录
    -e 检查文件是否存在
    -f 检查文件是否存在且为文件
    -r 检查文件是否存在且可读
    -s 检查文件是否存在且不为空
    -w 检查文件是否存在且可写
    -x 检查文件是否存在且可执行
    -O 检查文件是否存在并且被当前用户拥有
    -G 检查文件是否存在并且默认组为当前用户组
    file1 -nt file2 检查file1是否比file2新
    file1 -ot file2 检查file1是否比file2旧
    file1 -ef file2 检查file1是否与file2是同一个文件,判定依据的是i节点
6.多重条件判断
    -a    和&&    同真为真
    -o    和||    任意满足一个则为真
    
6.if高级用法
    if (())    可植入数学表达式
    if [[]]    可在条件中使用通配符


八、循环语句

1.for循环的格式
    for i in {1..10}    
    for i in 1 2 3 4
    for i in `seq 10`
    for ((expr1;expr2;expr3))
      do
        command
      done
      
2.while循环的格式
    while [ 表达式 ]
    do
    command...
    done    
    
    注:":" or "True" 代表真
    
3.case语句格式
    case $var in        #定义变量;var代表是变量名
    pattern 1)         #模式1;用 | 分割多个模式,相当于or   command1        #需要执行的语句   ;;           #两个分号代表命令结束
    pattern 2)   command2   ;;  *)         #default,不满足以上模式,默认执行*)下面的语句   command4   ;;
    esac                 #esac表示case语句结束

4.until语句
    与while语法一致,until循环当条件为假时执行
    
5.循环控制
    break    马上停止执行本次循环,执行循环体后面的代码
    continue    循环体内的下面代码不执行,重新开始下一次循环
    sleep        控制循环
    shift        位置参数像左移,默认移动一位
    exit        脚本退出命令

九、SHELL函数

1.shell函数的介绍
     shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能。
     将完成一个功能的一段代码进行命名、封装
     函数的优点:
         1. 代码模块化,调用方便,节省内存
         2. 代码模块化,代码量少,排错简单
         3. 代码模块化,可以改变代码的执行顺序
2.函数定义
     语法一:
         函数名 () {
             代码块
             return N
         }
     语法二:
         function 函数名 {
             代码块
             return N
         }
     调用函数时直接输入函数名即可


十、文本处理之grep

grep: 负责从数据源中检索对应的字符串,行过滤。
grep用于根据关键字进行行过滤
grep options 'keys' filename
     OPTIONS:
         -i: 不区分大小写
         -v: 查找不包含指定内容的行,反向选择
         -w: 按单词搜索
         -n: 显示行号
         -A: 显示匹配行及后面多少行
         -B: 显示匹配行及前面多少行
         -o: 打印匹配关键字
         -c: 统计匹配到的次数
         -r: 逐层遍历目录查找
         -C: 显示匹配行前后多少行
         -l:只列出匹配的文件名
         -L:列出不匹配的文件名
         -e: 使用正则匹配
         -E:使用扩展正则匹配
         ^key:以关键字开头
         key$:以关键字结尾
         ^$:匹配空行
         --color=auto :可以将找到的关键词部分加上颜色的显示


十一、文本处理之sed

1.sed介绍
    sed是Linux中提供的一个外部命令,它是一个行(流)编辑器,编辑对象是文件中的行。
2.sed语法
    sed [options]'{command}{flags}' [filename]
    命令选项:
        -e script 将脚本中指定的命令添加到处理输入时执行的命令中  多条件,一行中要有多个操作
        -f script 将文件中指定的命令添加到处理输入时执行的命令中
        -n     抑制自动输出
        -i     编辑文件内容
        -i.bak   修改时同时创建.bak备份文件。
        -r     使用扩展的正则表达式
        !     取反 (跟在模式条件后与shell有所区别)
    
    sed常用内部命令
        曾:a(在匹配后面添加) i(在匹配前面添加)
        删:d
        改:s(替换查找字符串) c(更改行)y(转换)
        查:p(打印)
    
    flags
        数字:    表示新文本替换的模式
        g:        表示用新文本替换现有文本的全部实例
        p:        表示打印原始的内容
        w filename:    将替换的结果写入文件

十二、文本处理之awk

1.awk介绍:
    awk是一种可以处理数据、产生格式化报表的语言。awk认为文件中的每一行是一条记录,记录与记录的分隔符为换行符,每一列是一个字段,字段与字段的分隔符默认是一个或多个空格活tab制表符
    awk的工作方式是读取数据,将每一行数据视为一条记录(record),每条记录以字段分隔符分为若干字段,然后输出各字段的值。
    
2.awk语法
awk [options] [BEGIN] {program} [END] [filename]
    常用命令选项:
        -F    fs    指定描绘一行中数据字段的文件分隔符,默认空格
        -f    file    指定读取程序的文件名
        -v val=value    定义awk程序中使用的变量和默认值
    awk程序运行优先级是:
        1)BEGIN:在开始处理数据流之间执行
        2)program:如何处理数据流,必选项
        3)END:处理完数据流后执行,可选项
        
3.awk基本应用
1)对字段(列)进行截取
    awk -F: '{print $1,$NF}' /etc/passwd
    root /bin/bash
2)对记录(行)的提取
    指定行号:
    awk -F: 'NR==1{print $1,$NF};NR==3{print $1,$NF}' /etc/passwd
    root /bin/bash
    daemon /sbin/nologin
        注:NR:指定行号
    精确匹配
    awk -F: '$1=="user20"{print $1,$NF}' /etc/passwd
    user20 /bin/bash
    
    模糊匹配
    awk -F: '$1 ~ "^user20"{print $1,$NF}' /etc/passwd
    user20 /bin/bash

3)定义变量和数组
    定义变量:
    awk -v name='jiangfeng' 'BEGIN{print name}'
    jiangfeng
    
    定义数组
    awk 'BEGIN{ array[0]="jiang";array[10]="feng";print array[0]}'
    jiang
上一篇:Python基础之控制台打印不同颜色字符串


下一篇:python色彩缤纷的python(改变字体颜色以及样式)