zoukankan      html  css  js  c++  java
  • shell基础及变量

    一 Shell概述

    1.Shell的作用——命令解释器,“翻译官”

    shell作为一个人机接口,用于解释用户输入的命令,将命令解释为Linux内核可以执行的2进制代码,并将执行的结果返回在标准终端上。

    2.Shell在Linux系统中的位置

    二 Shell基础

    1.历史命令——history

    (1)命令

    [root@www~]# history [-raw] histfiles
    选项与参数:
    n :数字,意思是『要列出最近的n 笔命令行表』的意思!
    -c :将目前的shell 中的所有history 内容全部消除
    -a :将目前新增的history 命令新增入histfiles中,若没有加histfiles,则默认写入~/.bash_history
    -r :将histfiles的内容读到目前这个shell 的history 记忆中;
    -w :将目前的history 记忆内容写入histfiles中

    注意:历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改

    (2)历史命令的调用

    • 使用上、下箭头调用以前的历史命令
    • 使用“!n”重复执行第n条历史命令
    • 使用“!!”重复执行上一条命令
    • 使用“!字串”重复执行最后一条以该字串开头的命令

     eg:

    [root@localhost Ivy]# !24 <==运行第24 笔命令
    [root@localhost Ivy]# !! <==运行上一个命令,本例中亦即!24
    [root@localhost Ivy]# !al <==运行最近以al 为开头的命令

    (3)历史命令的读取与记录

    在正常的情况下,历史命令的读取与记录是这样的:

    • 当我们以 bash 登陆 Linux 主机之后,系统会主动的由家目录的 ~/.bash_history 读取以前曾经下过的命令,那么 ~/.bash_history 会记录几笔数据呢?这就与你 bash 的 HISTFILESIZE 这个变量配置值有关了!
    • 假设我这次登陆主机后,共下达过 100 次命令,『等我注销时, 系统就会将 101~1100 这总共 1000 笔历史命令升级到 ~/.bash_history 当中。』 也就是说,历史命令在我注销时,会将最近的 HISTFILESIZE 笔记录到我的纪录文件当中。
    • 当然,也可以用 history -w 强制立刻写入的。

    2.命令与文件补全——Tab

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

    3.命令别名——alias

    设置别名

    [root@localhost Ivy]# alias别名='原命令'

    删除别名
    [root@localhost ~]# unalias别名

    eg:[root@localhost ~]# alias grep=‘grep--color=auto’(注意等号两边不能有空格

    注意:alias的作用仅在该次登入的操作,即输入一次alias后,这个修改只在当前的Shell生效。如果重新开启一个Shell,或者重新登录,则这些alias将无法使用。

    alias永久化的方法:
    <1>.若要每次登入就自动生效别名,则把别名加在/etc/profile或~/.bashrc中。然后# source ~/.bashrc
    <2>.若要让每一位用户都生效别名,则把别名加在/etc/bashrc最后面,然后# source /etc/bashrc

    4.多命令顺序执行

      多命令执行符       格式                                 作用
           ;   命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
           &&   命令1&&命令2

    逻辑与(短路原则)

    命令1执行正确,命令2才执行

    命令1执行不正确,命令2不执行

            ||   命令1||命令2

    逻辑或(短路原则)

    命令1执行不正确,命令2才执行

    命令1执行正确,命令2不执行

    eg:(相当于if-else语句)

    ls test.sh && echo "good" || echo "not good“
    ls test.sh>/dev/null&& echo "good" || echo "not good“

    5.管道(命令1的正确输出作为命令2的操作对象)—— |

    [root@localhost ~]# 命令1 | 命令2

    (1)cut(切割)

    将一段信息的某一段给他『切』出来,处理的信息是以『行』为单位
    [root@localhost Ivy]# cut -d'分隔字符' -f fields <==用于有特定分隔字符
    [root@localhost Ivy]# cut -c 字符区间<==用于排列整齐的信息
    选项与参数:
    -d :后面接分隔字符。与-f 一起使用;
    -f :依据-d 的分隔字符将一段信息分割成为数段,用-f 取出第几段的意思;
    -c :以字符(characters) 的单位取出固定字符区间;

    eg:

    [root@www ~]# echo $PATH

    /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:

    [root@www ~]# echo $PATH | cut -d ':' -f 5

    # 以『 : 』作为分隔,因此会出现 /usr/local/bin

    # 列出第 3 与第 5

    [root@www ~]# echo $PATH | cut -d ':' -f 3,5

    (2)grep(搜索)

    [root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename

    选项与参数:

    -a :将 binary 文件以 text 文件的方式搜寻数据

    -c :计算找到 '搜寻字符串' 的次数

    -i :忽略大小写的不同,所以大小写视为相同

    -n :顺便输出行号

    -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!

    --color=auto :可以将找到的关键词部分加上颜色显示!

    eg:

    [root@www ~]# last | grep 'root' |cut -d ' ' -f1

    # 在取出 root 之后,利用上个命令 cut 的处理,就可以仅取得第一栏!

    (3)sort(排序)

    [root@www ~]# sort [-fbMnrtuk] [file or stdin]

    选项与参数:

    -f  :忽略大小写的差异,例如 A 与 a 视为编码相同;

    -b  :忽略最前面的空格符部分;

    -M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;

    -n  :使用『纯数字』进行排序(默认是以文字型态来排序的);

    -r  :反向排序;

    -u  :就是 uniq ,相同的数据中,仅出现一行代表;

    -t  :分隔符,默认是用 [tab] 键来分隔;

    -k  :以那个区间 (field) 来进行排序的意思

    eg:

    #以 : 来分隔的,以第三栏来排序

    [root@www ~]# cat /etc/passwd | sort -t ':' -k 3

    (4) uniq

    用于报告或忽略文件中的重复行,一般与sort命令结合使用。

    [root@www ~]# uniq [-ic]

    选项与参数:

    -i  :忽略大小写字符的不同;

    -c  :进行计数

     eg:

    #使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位;

    [root@www ~]# last | cut -d ' ' -f1 | sort | uniq

     #承上题,如果我还想要知道每个人的登陆总次数呢?

    [root@www ~]# last | cut -d ' ' -f1 | sort | uniq -c

     (5)tee

    用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。

    [root@www~]# tee [-a] file
    选项与参数:
    -a :以累加(append) 的方式,将数据加入file 当中!

    eg:

    [root@www~]# last | tee last.list| cut -d " " -f1
    # 将last 的输出存一份到last.list文件中
    [root@www~]# ls -l /home | tee ~/homefile| more
    # 将ls 的数据存一份到~/homefile,同时屏幕也有输出信息
    [root@www~]# ls -l / | tee -a ~/homefile| more
    # 要注意!tee 后接的文件会被覆盖,若加上-a 这个选项则能将信息累加。

    6.输出命令——echo

    [root@localhost ~]# echo [选项] [输出内容]
    选项:
    -e :支持反斜线控制的字符转换

    -n 不换行输出

    -E 禁用反斜线转义解释(默认)

    转义:
    a 发出警告声;
     删除前一个字符;
    c 最后不加上换行符号;
    f 换行但光标仍旧停留在原来的位置;
    换行且光标移至行首;
    光标移至行首,但不换行;
    插入tab;
    v 与f相同;
    \插入字符;
    nn插入nnn(八进制)所代表的ASCII字符;

    7.shell脚本

    基本元素
    (1)#!/bin/bash  必须的,指出shell的类型,写在第一行
    (2)# 注释
    (3)变量
    (4)控制

    运行Shell脚本方法
    方法1:
    # sh./datewho.sh
    方法2:

    # chmod+x datewho.sh
    # ./datewho.sh

    三 Shell中的变量和符号

    1.本地变量

    (1)命名规则:

    ①由字母、数字和下划线组成,但是不能以数字开头。
    ②在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。

    (2)变量赋值:

    变量=值

    注意!!!

    ①等号两边不可以有空格
    ②取值包含空格,必须用双引号括起来
    ③Shell变量可以用大小写字母,区分大小写

    (3)变量引用
    $变量名
    ${变量名}

    (4)清除变量
    unset 变量名
    eg:

    echo ${name}
    unset name (注意:name前没有$)

    (5)变量输出——echo

    ①双引号:可以有变量,echo时对变量进行替换,echo  "${PATH}";可以出现转义字符,echo -e "asdn adadss"

    ②单引号:任何字符都会原样输出,单引号字符串中的变量是无效的,echo时不做变量替换,echo '${PATH}'

    2.环境变量

    用于所有用户进程(通常称为子进程)。登陆进程称为父进程,通过pstree可以查看

    注意:

    (1)环境变量可以在命令行中设置,但用户注销时这些值将丢失
    (2)环境变量均为大写
    (3)必须用export命令导出

    设置环境变量
    variable-name=value
    export variable-name(环境变量名大写)
    显示环境变量
    env可以看到所有的环境变量
    echo $环境变量名(显示一个变量)
    清除环境变量
    unset 环境变量名

    3.内部变量

    是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。

    部分内部变量:
    $# ——传送给shell程序的位置参数的数量
    $?——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)。0表示没有错误,其他任何值表明有错误。
    $0——shell程序的名称
    $*——调用shell程序时所传送的全部参数的单字符串,“参数1”“参数2”…形式保存的参数

    $@“参数1参数2”…形式保存的参数
    $n第n个参数
    $$本程序的PID

    4.符号

    (1)注释符#

    除了#!/bin/bash里的#特殊

    (2)美元符$

    变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来

    (3)单引号

    被引起的字符全部做普通字符,即全部原样
    echo ‘my $SHELL’

    (4)双引号

    引号内的内容,除$、转义符、倒引号`这三个保留特殊功能,其他字符均做普通字符。

    (5)倒引号(数字1键旁边的那个键)

    引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。

    (6)反斜线

    反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠()能够阻止shell把后面的字符解释为特殊字符。
    例4:
    [yuqun@yuqun~]$echo “Filename is N0$*”
    Filename is N0$*
    注意:在单引号括起来的字符串中,反斜线也成为普通字符,而失去转义字符功能。

    (7)获取字符串长度

    string="abcd"
    echo ${#string} #输出4

    (8)提取子字符串

    以下实例从字符串第2 个字符开始截取4 个字符
    string="runoobis a great site"
    echo ${string:1:4} # 输出unoo

  • 相关阅读:
    day1-字符串拼接、表达式、break和continue
    ssh免密登录
    1-5 文档的基本 CRUD 与批量操作
    1-4 安装logstash
    1-3 安装cerebro
    1-2 kibana 7.5.1 安装配置
    1-1 elasticsearch7.5 集群搭建 es 7
    生产环境k8s集群搭建
    Gearman任务分布系统部署windows平台_使用Cygwin
    [转载]单元测试之道(使用NUnit)
  • 原文地址:https://www.cnblogs.com/mlan/p/8612533.html
Copyright © 2011-2022 走看看