• linux shell笔记


    1.基本命令

    touch 创建空文件(当然,你也可以使用echo >filename)

    ln 创建链接符号(快捷方式|引用):

    1. 符号链接:ln –s
    2. 硬链接:ln

    区别:

    1. 符号链接产生了一个快捷方式,是对源文件的一个链接。
    2. 硬链接是底层字节的链接,简单来说,相当于是一个文件,两个文件名,占用同一块扇区,好处是省空间,即便删除一个,只要还有硬连接,这个文件就依然存在。

    ls –i 查看文件inode编号(唯一的,可以确认文件是否为同一个,类似于hash值)

    mv 移动|重命名

    file 查看文件(文件夹)类型等信息

    cat 显示内容 -n:所有行号 ;-b:有字加行号;-T:不显示制表符;

    more 按页显示;例如:cat xxx |more

    tail 查看文件结尾;-n number(或-number):指定最后几行;-f:追踪,可以动态追踪日志文件。

    head 与tail类似,不过没有-f参数

    ps 进程

    top 显示linux进程(Linux版任务管理器)

    kill 干掉进程

    df 查看硬盘空间

    sort 文件内容排序

    grep 搜索文本

    $BASH_SUBSHELL 子shell检测变量

    sleep timeCount(s)

    句子结尾加&:后台模式运行

    jobs 工作

    (command 1;command 2…) 任务列表,可以同时执行

    coproc 协程(后台有个子shell,执行你的命令,同时生成一个job)

    which 查看命令程序所在位置

    history 命令历史记录

      !! 上一个历史命令(省着按向上箭头了)

      !number 第n条历史命令被执行

    环境

    printenv 查看环境变量(env只能查看所有的全局变量); 本命令支持查看某条变量(不需要加美元符号,echo需要)

    set 查看|设置环境变量

    export 到处变量为全局变量,就可以在各种shell中使用了(并不能使shell的父shell环境变量发生变化)

    unset 删除环境变量

    passwd (chpasswd) 密码查看|修改

    umask 为文件分配默认权限

    chmod 更改权限

    chown 改变归属权

    分区

    fdisk 分区;p:显示基本设备信息;n:new个分区;w:write进设备

    mkefs 格式化ext分区;

    mke2fs 格式化ext2分区;

    mkfs.ext3 格式化ext3分区;

    mkfs.ext4 格式化ext4分区;

    mkreiserfs 格式化reiserfs分区

    jfs_mkfs 格式化jfs分区

    mkfs.xfs 格式化xfs分区

    mkfs.zfs 格式化zfs分区

    mkfs.btrfs 格式化btrfs分区

    fsck 检查修复分区 -a:自动检测修复;-A:列出fstab中所有分区,并检测;-C:显示支持的文件系统检测时的进度条(ext2、3);-s:多个文件系统依次检查;

    LVM 可以添加多个硬盘到一个卷组(整合为一个大分区也没有问题),可以创建快照,镜像。

    如何创建LVM物理卷?使用fdisk t来改变分区类型(为8e);或使用pvcreate创建,pvdisplay查看创建进度;

    vgcreate 创建卷组(为物理卷);例如:vgcreate Vol1 /dev/sda1;vgdisplay查看进度

    lvcreate 创建逻辑卷;例如:lvcreate –l 100%FREE –n lvtest Vol1;lvdisplay查看进度

    淡淡这样还不够!!!还要有文件系统,如ext4的LVM:mkfs.ext4 /dev/Vol1/lvtest。上述创建了一个ext4类型的逻辑卷lvtest。还要手动挂载:mount /dev/Vol1/lvtest /mnt/my_partation

    LVM的一堆管理命令:

    vgchange 激活和禁用卷组
    vgremove 删除卷组
    vgextend 将物理卷加到卷组中
    vgreduce 从卷组中删除物理卷
    lvextend 增加逻辑卷的大小
    lvreduce 减小逻辑卷的大小

    2.shell编程

    变量是宽松的定义,任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量 Var1 和变量 var1 是不同的。

    shell编程最强大的地方在于可以从console的输出中取回这些输出,并随便利用,一旦这样做,则可以利用shell做任何事情了,只要你能在console中输出它。

    如何从shell中获取输出的内容?两种方法:

    1. 反引号符号;
    2. $();

     例如,使用date命令可以输出当前时间,如果写shell脚本的话,可以通过如下两种写法获取console的date:

    1 date=$(date);
    2 date=`date`;

    字符串如果合并的话,直接各种引号,而不需要+或者其他的操作,如:

    str1="string1";
    str2="string2";
    str3=$str1$str2;

    输出或引用一个变量,则可以:

    echo $str3;

    输出重定向:>

    在已有的文件中追加内容:>>

    输入重定向:<

    内联输入重定向:<<

    管道:|

    实际上,windows console中也支持管道.

    例如,之前用more对console的内容进行分页:ls -al |more

    既然是管道,必然支持很多管道,虽然可能只会用到两个

    shell中计算:expr

    例如计算1+2:

    expr 1 + 2
    #注意上式的空格,运算符间都是有的
    表11-1 expr 命令操作符
    arg1 |arg2  如果arg1既不是null也不是0,返回arg1;否则arg2
    ARG1 & ARG2 如果没有参数是null或零值,返回 ARG1 ;否则返回 0
    < 如果 ARG1 小于 ARG2 ,返回 1 ;否则返回 0
    <= 如果 ARG1 小于或等于 ARG2 ,返回 1 ;否则返回 0
    = 如果 ARG1 等于 ARG2 ,返回 1 ;否则返回 0
    != 如果 ARG1 不等于 ARG2 ,返回 1 ;否则返回 0
    >= 如果 ARG1 大于或等于 ARG2 ,返回 1 ;否则返回 0
    > 如果 ARG1 大于 ARG2 ,返回 1 ;否则返回 0
    +  
    -  
    *  
    /  
    %  
    STRING : REGEXP 如果 REGEXP 匹配到了 STRING 中的某个模式,返回该模式匹配
    match STRING REGEXP 如果 REGEXP 匹配到了 STRING 中的某个模式,返回该模式匹配
    substr STRING POS LENGTH 返回起始位置为 POS (从 1 开始计数)、长度为 LENGTH 个字符的子字符串
    index STRING CHARS 返回在 STRING 中找到 CHARS 字符串的位置;否则,返回
    index STRING CHARS 返回字符串 STRING 的数值长度
    + TOKEN 将 TOKEN 解释成字符串,即使是个关键字
    (EXPRESSION) 返回 EXPRESSION 的值

    需要注意,尽可能的把运算符号之前加上转义字符,否则很可能会导致expr收到错误!

    例如 expr 1 * 2

    所以,bash shell为了保持跟Bourne shell的兼容而包含了 expr 命令,但它同样也提供了一种更简单方法来执行数学表达式。在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号( $[ operation ] )将数学表达式围起来。

    这样,就相当方便了,还是1+2,则可以写成:

    $[1+2]

    而根本不需要考虑空格的问题~~~

    这里需要注意的是,bash shell本身不支持浮点数运算,所以可以利用其他的方法:

    bash计算器:bc;

    使用bash需要注意,精度(scale)默认为0,所以需要设置:scale=0

    bc本身支持定义变量

     在脚本中使用bc:

    echo “scale=4;1/2” |bc
    # 或
    echo “scale=4;print 1/2” |bc

     更好的方法是使用内联输入重定向(<<):

    #!/bin/bash
    var1=10.46
    var2=43.67
    var3=33.2
    var4=71
    var5=$(bc << EOF
    scale = 4
    a1 = ( $var1 * $var2)
    b1 = ($var3 * $var4)
    a1 + b1
    EOF
    )
    echo The final answer for this mess is $var5

    ## EOF既是输入的开始,又是输入的结束,所以计算没有问题的

    脚本退出命令:

    exit exitCode

    查看退出代码:

    echo $?

    退出代码意图:

    0 命令成功结束
    1 一般性未知错误
    2 不适合的shell命令
    126 命令不可执行
    127 没找到命令
    128 无效的退出参数
    128+x 与Linux信号x相关的严重错误
    130 通过Ctrl+C终止的命令
    255 正常范围之外的退出状态码

     条件结构:if,then,elif,fi

    if command
    #注意是command不是condition!
    then
      commands
    elif command
    then
          commands
    ...
    else
      commands
      ...
      if command
      then
        commands
      fi
    fi
    #或
    if command;then
      commands
    fi

    test

    如何是condition呢?答案是:

    test,即if行由command 后面改为:

    test condition

    数值比较

    例如:

    ret=1
    if test ret -eq 1
    then
        echo ret is 1
    fi

    至于里面的-eq,则是判断条件的一种形式:等于。

    test 命令的数值比较功能

    说明

    等效

    n1 -eq n2

    == =

    -ge

    >= >=
    -gt > <
    -le <= <=
    -lt < <
    -ne != !=

    test的另一种写法是:

    [ condition ]
    #注意方括号都和condition有空格的!!!

    例如,将test子例改写一下,即:

    ret=1
    if [ ret -eq 1 ]
    then
        echo ret is 1
    fi

    test可以做:

     数值比较
     字符串比较
     文件比较

    字符串比较

    test字符串比较测试
    str1=str2 ==
    !=  
    < len
    > len
    -n len>0
    -z len=0

    特别需要注意容易犯错误的地方在于符号会与bash本身的一些符号冲突而导致执行出错!!!包括:

    <,>.

    所以要进行转义,即:

    >,<.

    文件比较

    文件比较功能参数
    -d file 存在目录
    -e file exist
    -f file 存在文件
    -r file read
    -s file 文件空
    -w file write
    -x file execute
    -O file own
    -G file group
    file1 -nt file2 new than
    file1 -ot file2 old than

    如何简单的获取条件判断时条件的结果呢?

    test 1 = 1;echo $?

    上句测试,为真,显示0

    注意:test的两个参数,不应该在其中计算,而应该在之前的步骤完成,否则可能会得到错误的结果!!!(亲测)

    例如:一定存在$HOME,所以test -e $HOME 必然为真(0)。

    但是,假设$HOME中不存在123目录或文件夹,则test -e $HOME/123依然会返回0.

    而按照我写的注意,写为x1=$HOME/123;test -e $1;echo $?则会返回1,即真实结果.

    所以一定要注意这种情况!

    更多的条件:

    &&,||

    更高级的数值条件:(())

    (())操作符
    val++  
    val--  
    ++val  
    --val  
    !
    ~ 按位非
    **
    <<  
    >>  
    & 按位与
    | 按位或
    && 逻辑与
    || 逻辑或

    测试过程中,发现,还支持很多操作:==,!=,<,>,<=,>=,+,-,*,/.

    此外,(())不需要转义以及空格!!!

    更高级的字符串条件:[[]](20章)

    高级功能:regex,

    更高级的条件结构:case

    case variable in
    pattern1 | pattern2 ) commands1 ;;
    pattern3 ) commands2 ;;
    *) default commands ;;
    esac

     更多的结构化:for

    for var in list
    do
    commands
    done

    上面所说的list,其实可以是字符串(每个项以空格分开,如果想避免项中有空格,则可以为每个项加一对引号,如果同时存在引号,最好转义,用另一种引号次之)。

    看来,这个for用着还是没有编程语言的方便,如果想执行100次某些命令,那么需要生成一个具有100项的列表。

    for star in $(ls)
     do 
        echo "111 $star"
    done
  • 相关阅读:
    redis基础
    docker日志清理脚本
    Hive修改表的所有者(Owner)
    User xxx does not have privileges for CREATETABLE的解决办法
    Spark读取Hive表中文显示乱码的解决办法
    Go语言之标识符与关键字
    Go语言之数据类型(三)
    bootstrapTable频繁向后台接口发请求
    框架整合疑云
    业务开发中-设计模式使用
  • 原文地址:https://www.cnblogs.com/absudra/p/9572706.html
Copyright © 2020-2023  润新知