美文网首页
linux_shell基础

linux_shell基础

作者: tf_dejs | 来源:发表于2017-08-20 18:48 被阅读0次

    Shell是一个"命令行解释器",它为用户提供了一个向Linux内核发送请求以便运行程
    序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
    同时也是一个"功能相当强大的编程语言",易编写,易调试,灵活性较强。Shell是解
    释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

    echo

    echo输出的内容如果有空格则需要额外加上引号
    感叹号有特殊作用,加双引号不能正确执行,加但引号可以

    echo [选项][输出内容]
    -e选项支持反斜线控制的字符转换

    控制字符 作用
    |输出\本身
    \a 输出警告音
    \b 退格键
    \c 取消输出行末的换行符,和"-n"选项一致
    \e ESCAPE键
    \f 翻页
    \n 换行
    \r 回车键
    \t 制表符
    \v 垂直制表符
    \0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
    \xhh 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数

    第一个脚本

    #!/bin/Bash
    #The first program
    #Author: Alex (Email: Alex@example.com)
    
    echo "hello world"
    

    脚本执行

    • 赋予执行权限,直接运行
    chmod 755 hello.sh
    ./hello.sh
    
    • 通过bash调用执行脚本
    bash hello.sh
    

    历史命令与命令补全

    历史命令

    history [选项] [历史命令保存文件]
    -c 清空历史命令
    -w 把缓存中的历史命令写入历史命令保存文件"~./bash_history"

    注意:

    • 历史命令默认会保存1000条,可以在环境变量配置文件/ect/profile中进行修改
    • 使用上下箭头可以调用以前的历史命名
    • 使用"!n"重复执行第"n"条命令
    • 使用"!!"重复执行上一条命令
    • 使用"!字串"重复执行最后一条以该字串开头的命令

    命令补全

    在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全

    命令别名"alias"

    设定别名:alias 别名="原命令"
    查询别名:alias

    命令执行顺序

    • 第一顺位执行用"绝对路径"或"相对路径"执行的命令。
    • 第二顺位执行别名。
    • 第三顺位执行Bash的内部命令。
    • 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。

    让别名永久生效

    可以写入到/home/username/.bashrc
    理解.bashrc,可查看linux环境变量

    删除别名

    unalias 别名

    Bash 常用快捷键

    快捷键 作用
    ctrl+A 把光标移动到命令行开头
    ctrl+E 把光标移动到命令行结尾
    ctrl+C 强制终止当前的命令
    ctrl+L 清屏,相当于clear命令
    ctrl+U 删除或剪切光标之前的命令
    ctrl+K 删除或剪切光标之后的内容
    ctrl+Y 粘贴ctrl+U或ctrl+K剪切的内容
    ctrl+R 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
    ctrl+D 退出当前终端
    ctrl+Z 暂停,并放入后台
    ctrl+S 暂停屏幕输出
    ctrl+Q 恢复屏幕输出

    输入输出重定向

    标准输入输出

    设备 设备文件名 文件描述符 类型
    键盘 /dev/stdin 0 标准输入
    显示器 /dev/sdtout 1 标准输出
    显示器 /dev/sdterr 2 标准错误输出

    输出重定向

    标准输出重定向

    符号 作用
    命令 > 文件 覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
    命令 >> 文件 追加的方式,把命令的正确输出输出到指定的文件或设备当中

    标准错误输出重定向

    符号 作用
    错误命令 2> 文件 覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
    错误命令 2>> 文件 追加的方式,把命令的错误输出输出到指定的文件或设备当中

    正确输出和错误输出同时保存

    符号 作用
    命令 > 文件 2>&1 覆盖的方式,把正确输出和错误输出都保存到同一个文件中去
    命令 >> 文件 2>&1 追加的方式,把正确输出和错误输出都保存到同一个文件中去
    命令 &> 文件 覆盖的方式,把正确输出和错误输出都保存到同一个文件中去
    命令 &>> 文件 追加的方式,把正确输出和错误输出都保存到同一个文件中去
    命令 >> 文件1 2>>文件2 把正确输出追加到"文件1"中,把错误输出追加到"文件2"中

    注意:"2"等符号之间沒有空格,命令文件等与符号之间可以有空格

    输入重定向

    • 把文件作为命令的输入
      命令 < 文件
    • 把标识符之间内容作为命令的输入
    命令 << 标识符
    ...
    标识符
    

    举例:
    wc [选项] [文件名]
    -c 统计字节数
    -w 统计单词数
    -l 统计行数

    多命令的顺序执行

    多命令顺序执行

    多命令执行符 格式 作用
    ; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
    && 命令1&&命令2 逻辑与:1执行,2才会执行;1执行不正确,2不会执行
    || 命令1||命令2 逻辑或:1执行,2不会执行;1执行不正确,2执行

    管道符

    命令1作为命令2的操作对象
    命令1|命令2
    例如:cat file|pager 分页显示

    grep搜索

    grep [选项] "搜索内容" 文件名
    -i: 忽略大小写
    -n: 输出行号
    -v: 反向查找
    --color=auto 搜索出的关键字用颜色显示

    通配符与其他符号

    通配符

    通配符 作用
    ? 匹配任意一个字符
    * 匹配0个或任意多个字符,也就是任意内容
    [ ] 匹配中括号中任意一个字符,例如:[ab]就是匹配a或b
    [-] 匹配中括号中一个字符,例如:[a-c]就是匹配a,或b,或c
    [^] 逻辑"非"匹配不是括号中的一个字符

    bash中的其他符号

    符号 作用
    '' 单引号:在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义。
    "" 双引号:在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。
    `` 反引号:反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。
    $() 和反引号作用一样,用来引用系统命令
    # 在Shell脚本中,#开头的行代表注释
    $ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。
    \ 转义符:跟在\之后的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不当做是变量引用。

    例子:

    $ echo "date"
    date
    $ echo "$(date)"
    Mon Jul 31 14:52:54 CST 2017
    $ greet="hello linux"
    $ echo greet
    greet
    $ echo $greet
    hello linux
    

    用户自定义变量

    变量

    变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。

    变量设置规则

    • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的
    • 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
    • 变量用等号连接值,等号左右两侧不能有空格
    • 变量的值如果有空格,需要使用单引号或双引号包括。
    • 在变量的值中,可以使用“\”转义符。
    • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
    • 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
    • 环境变量名建议大写,便于区分。

    变量分类

    • 用户自定义变量
    • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
    • 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
    • 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

    本地变量(用户自定义变量)

    变量定义
    $ name="alex zhang"
    变量叠加
    $ aa=123
    $ aa="$aa"456
    $ aa=${aa}789
    变量调用
    $ echo $name
    变量查看
    $ set
    变量删除
    $ unset name
    

    环境变量

    用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。

    设置环境变量

    一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。export将变量申明为全局变量

    • 申明变量:export 变量名=变量值 或者 export 本地变量名,申明该本地变量为环境变量
    • 查询变量:env
    • 删除变量:unset 变量名

    系统常见环境变量

    PATH:系统查找命令的路径
    PATH变量叠加:PATH="$PATH":/username/project

    三种修改环境变量的方式

    • PATH="$PATH":/username/project 直接叠加环境变量,临时有效
    • vi /etc/profile 在适当位置添加PATH="$PATH":/username/project,所有用户有效
    • vi ~/.bash_profile 修改PATH行,添加PATH="$PATH":/username/project,当前用户有效

    注意:

    /username/project添加到环境变量,该目录下的脚本文件可以直接执行,而不再需要”绝对路径“或”相对路径“,比如正常需要执行脚本文件”hello.sh“需要chmod 755 hello.sh然后./hello.sh/username/project/hello.sh才能执行,这时只需hello.sh就可直接执行

    PS1定义系统提示符的变量

    \d:显示日期,格式为“星期 月 日”
    \h:显示简写主机名。如默认主机名“localhost”
    \t:显示24小时制时间,格式为“HH:MM:SS”
    \T:显示12小时制时间,格式为“HH:MM:SS”
    \A:显示24小时制时间,格式为“HH:MM”
    \u:显示当前用户名
    \w:显示当前所在目录的完整名称
    \W:显示当前所在目录的最后一个目录
    \#:执行的第几个命令
    \$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户
    会显示提示符为“$”
    

    例子:

    alex@alex-zh ~ $ PS1='[\u@\t \w]\$ '
    [alex@16:14:28 ~]$ PS1='[\u@\t \#\w]\$ '
    [alex@16:14:59 20~]$ PS1='\u@\H \w \$ '
    alex@alex-zh ~ $ 
    

    位置参数变量

    位置参数 作用
    $n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
    $* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
    $@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
    $# 这个变量代表命令行中所有参数的个数

    例子:

    #!/bin/bash
    #
    num1=$1
    num2=$2
    sum=$(($num1+$num2))
    echo $sum
    
    

    $*$@区别

    $* 中的所有参数看成是一个整体,所以这个 for 循环只会循环一次
    $@ 中的每个参数都看成是独立的,所以“ $@ ”中有几个参数,就会循环几次

    Bash运算符

    数值运算与运算符

    linux Shell中,所有变量默认为字符串

    declare声明变量类型
    declare [+/-][选项]变量名
    
    选项 变量
    - 给变量设定类型属性
    + 给变量取消类型属性
    -i 将变量声明为整数型
    -x 将变量声明为环境变量
    -p 显示指定变量的被声明类型

    选项:

    选项 变量
    - 给变量设定类型属性
    + 给变量取消类型属性
    -i 将变量声明为整数型
    -x 将变量声明为环境变量
    -p 显示指定变量的被声明类型

    数值运算

    • 方法1
    $ aa=11
    $ bb=22
    $ declare -i cc=$aa+$bb    # 声明为整数型
    
    • 方法2:expr或let数值运算工具
    $ aa=11
    $ bb=22
    $ dd=$(expr $aa + $ bb)  # dd是aa和bb值的和,“+”号左右有空格
    
    • 方法3:$((运算式))或$[运算式]
    $ aa=11
    $ bb=22
    $ ee=$(($aa+$bb))
    $ ff=$[$aa+$bb]
    

    运算符

    优先级 运算符 说明
    13 -, + 单目负、单目正
    12 !, ~ 逻辑非、按位取反或补码
    11 *, /, % 乘除取模
    10 +, - 加,减
    9 <<, >> 按位左移、按位右移
    8 < =, > =, <, > 小于或等于、大于或等于、小于、大于
    7 ==, != 等于、不等于
    6 &按位与
    5 ^ 按位异或
    4 | 按位或
    3 && 逻辑与
    2 || 逻辑或
    1 +, =, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= 赋值、运算且赋值

    变量测试与内容替换

    变量置换方式 变量y没有设置 变量y为空值 变量y设置值
    x=${y-新值} x=新值 x为空 x=$y
    x=${y:-新值} x=新值 x=新值 x=$y
    x=${y+新值} x为空 x=新值 x=新值
    x=${y:+新值} x为空 x为空 x=新值
    x=${y=新值} x=新值;y=新值 x为空;y值不变 x=$y;y值不变
    x=${y:=新值} x=新值;y=新值 x=新值y=新值 x=$y;y值不变
    x=${y?新值} 新值输出到标准错误输出(就是屏幕) x为空 x=$y
    x=${y:?新值} 新值输出到标准错误输出 新值输出到标准错误输出 x=$y

    环境变量配置文件

    环境变量会在一系列shell中有效,本地变量在本shell窗口有效。环境变量比本地变量适用范围多一些,修改环境变量文件永久性的更改环境变量

    source命令
    修改了配置文件,需要退出再重新登陆才能生效。而source或者“.”避免了这个过程
    用法1:source 配置文件
    用法2:. 配置文件

    • /etc/profile
      • 作用:USER变量,LOGNAME变量,MAIL变量,PATH变量,HOSTNAME变量,umask
      • 调用/etc/profile.d/*.sh
    • /etc/profile.d/*.sh
      • 所有".sh"结尾的文件
    • ~/.bash_profile
      • home目录,对当前用户有效
      • 调用~/.bashrc
      • 在PATH变量后面加入了:$home/bin这个目录
    • ~/.bashrc
      • home目录,当前用户有效
      • 定义默认别名
      • 调用/etc/bashrc
    • /etc/bashrc
      • PS1 变量
      • umask
      • PATH变量
      • 调用/etc/profile.d/*.sh

    相关文章

      网友评论

          本文标题:linux_shell基础

          本文链接:https://www.haomeiwen.com/subject/rbhklxtx.html