美文网首页
初识shell

初识shell

作者: 一本正经地胡说八道_bbeb | 来源:发表于2020-07-16 11:35 被阅读0次

    1、创建shell脚本文件

    vim test.sh

    2、shell脚本第一行

    第一行需要写:#!/bin/bash

    这一行( #!/bin/bash )其实并不是必不可少的,但是它可以保证此脚本会被我们指定的 Shell 执行。

    3、给脚本文件添加可执行权限

    查看权限:ls -l

    添加可执行权限:chmod +x test.sh 

    4、shell语法

    1、变量  aa="ceshi"  等号两遍一定不要加空格

    2、echo显示内容

    echo "hello world"

    echo "hello $aa"  输出变量,切记不能用单引号,如果是单引号输出为 hello $aa

    echo $aa  直接输出变量

    3、read请求输入

    1、read name

        echo "姓名:$name"

    2、带有输入提示的

    read -p "请输入姓名:" name   

    echo "姓名:$name"

      3、-n 限制字数

    read -p "请输入姓名:" -n 10 name    限制10字节,超过会立即显示输出内容

      4、-t显示输入时间

    read -p "请输入姓名:" -t 30 name    限制30秒内输入,超时立即显示输出

      5、-s隐藏输入内容

    read -p "请输入密码:" -s password

    4、数学运算

    1、整数运算

    let  "a = 1"

    let "b = 2"

    let "c = a + b"

    echo "c=$c"

    2、小数计算bc

    echo "scale=3;12.3/3"|bc

    scale=3;保留三位小数

    5、参数变量

    $# :包含参数的数目

    $0 :被运行的脚本的名称

    $1 :第一个参数

    $2:第二个参数.....

    shift:移动参数

    echo "这是第一个参数:$1"

    shift

    echo "这是新的第一个参数:$1"    此时的$1的值为第二个参数的值,依次往后推

    6、数组

    arr=('111' '222' '333' '444')    每一项中间用空格分隔,下标同样从0开始

    arr[6]='666'

    echo "数组第二项是:${arr[1]}"

    echo ${arr[*]}  会输出数组的所有项

    7、判断

    1、if语句判断语句后面需要加;与then分隔,并且以fi结束,[]中间需要加空格

    read -p "请输入姓名:" name

    if [ $name = "qwer" ];

    then

    echo "hello $name"

    elif [ $name = "asdf" ];

    then

    echo "name=$name"

    else

    echo "bye bye!"

    fi

    2、字符串判断

    $string1 = $string2 : 两个字符串是否相等。Shell 大小写敏感,因此 A 和 a 是不一样的。

    $string1 != $string2 : 两个字符串是否不同。

    -z $string : 字符串 string 是否为空。

    -n $string : 字符串 string 是否不为空。

    3、数字判断

    $num1 -eq $num2  : 两个数字是否相等。和判断字符串所用的符号( = )不一样。

    $num1 -ne $num2 : 两个数字是否不同。

    $num1 -lt $num2 : 数字 num1 是否小于 num2。

    $num1 -le $num2 : 数字 num1 是否小于或等于 num2。

    $num1 -gt $num2 : 数字 num1 是否大于 num2。

    $num1 -ge $num2 : 数字 num1 是否大于或等于 num2。

    4、判断文件

    -e $file :文件是否存在。

    -d $file : 文件是否是一个目录。因为 Linux 中一切都是文件,目录也是文件的一种。

    -f $file : 文件是否是一个文件。

    -L $file : 文件是否是一个符号链接文件。

    -r $file : 文件是否可读。

    -w $file : 文件是否可写。

    -x $file : 文件是否可执行。

    $file1 -nt $file2 : 文件 file1 是否比 file2 更新。

    $file1 -ot $file2 : 文件 file1 是否比 file2 更旧。

    5、测试多个条件

    &&:逻辑与

    ||:逻辑或

    !:非运算

    示例:

    1、

    if [ $name = 'qwer' ] && [ -d $url1 ];

    then

        echo "name为qwer,文件1是目录"

    fi

    2、

    if [ ! -e $url1 ];

    then

        echo "文件1不存在"

    fi

    6、测试多个条件case;case可以在匹配中做或匹配;示例如下:

    case $userName in

    "qwer" | "qw" | "er")

    echo "用户名为qwer或qw或er"

    ;;

    "asdf")

    echo "用户名为asdf"

    ;;

    "zxcv")

    echo "用户名为zxcv"

    ;;

    *)

    echo "没有结果"

    ;;

    esac

    case $userName in :$userName 表示我们要测试的变量是输入的第一个参数。

    "qwer") : 测试其中一个 case,也就是 $userName 是否等于 "qwer"。当然,我们也可以用星号来做通配符来匹配多个字符,例如 "q*") 可以匹配所有以 q 开头的字符串。

    ;;  : 类似于主流编程语言中的 break;,表示结束 case 的读取,程序跳转到 esac 后面执行。

    *)  : 相当于 if 条件语句的 else,表示“否则”,就是“假如不等于上面任何一种情况”。

    esac : case 的反写,表示 case 语句的结束。

    8、循环

    1、while循环

    语法:

    while [ 条件测试 ]

    do

        做某些事

    done

      示例:

    while [ -z $userName ] && [ $userName != "asd" ]

    do

    read -p "请输入用户名:" userName

    done

    echo "用户名输入正确"

    2、until循环

    直到条件为真时才会结束循环

    语法:

    until [ $password = "123" ]

    do

    read -p "请输入密码:" -s password

    done

    echo "密码输入正确!"

    3、for循环

    示例1:

    arr=("q" "w" "e" "r")

    for item in ${arr[*]}

    do

    echo "输出:$item"

    done

    示例2:

    for item in "a" "s" "d" "f"

    do

    echo "输出:$item"

    done

    示例3:

    (ls *.sh  linux命令,列出当前目录以.sh结尾的文件)

    for file in `ls *.sh`

    do

    echo "输出文件:$file"

    done

    示例4:

    seq命令用于产生从某个数到另外一个数之间的所有整数。

    seq语法:

    seq [选项]... 尾数

    seq [选项]... 首数 尾数

    seq [选项]... 首数 增量 尾数

    选项:

    -f, --format=格式 使用printf 样式的浮点格式

    -s, --separator=字符串,

    使用指定字符串分隔数字(默认使用:\n)

    -w, --equal-width 在列前添加0 使得宽度相同

    指定格式:

    示例1:seq -f "%3g" 9 11       

    %后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格。

    输出:

      9

    10

    11

    示例2:seq -f "str%03g" 9 11

    输出:

    str009

    str010

    str011

    示例3:seq -w 98 101

    输出:

    098

    099

    100

    101

    示例4:seq -s '=' 1 5

    输出:

    1=2=3=4=5

    9、函数

    定义函数:函数的完整定义必须放置在函数调用之前

    方式1:

    函数名 (){

    函数体

    }

    注:函数名后面的括号里面不能放置任何参数

    方式2:

    function 函数名 {

    函数体

    }

    示例1:

    testFun(){

    echo "this is function!"

    }

    testFun

    传递参数:

    跟shell脚本传递参数相同

    示例2:

    testFun(){

    echo "这是第一个参数:$1"

    echo "这是第二个参数:$2"

    }

    testFun "测试" hello

    testFun 1 23

    返回值:

    test(){

    return 1

    }

    a=$(test)

    return 只能返回整型,不能返回字符串

    返回字符串:

    test1(){

    local str="this is string"

    echo "返回字符串:$str"

    }

    b=$(test1)

    echo "返回值:$b"

    变量作用范围:

    默认变量都是全局变量(global)

    创建局部变量:local    local num1=12

    重载命令:

    ls(){

    command ls -lh

    }

    ls

    注意:如果没有 command 这个关键字(command 是英语“命令”的意思),那么程序会陷入无限循环。

      如果你不小心忘了 command 关键字而陷入无限循环,可以用 Ctrl + c 的组合快捷键来停止程序。

    5、linux命令

    pwd:展示当前路径

    ls:列出目录文件

    cp:拷贝

    rm:移除文件

    -i 向用户确认是否删除

    -f强制删除

    -r递归删除

    find:查找  find . -name "test.txt"  (查找当前目录的test.txt文件)

    cat:一次性展示文件的所有内容

    用法:cat test.txt    显示行号:cat -n test.txt

    less:分页显示文件内容

    空格:显示下一页内容

    回车:读取下一行内容

    d:前进半页

    b:后退一页

    y:后退一行

    u:后退半页

    q:停止退出

    head:显示文件开头(默认10行)

    用法:head -n 20 test.txt  (显示文件开头20行)

    tail:显示文件结尾(默认10行)

    用法:tail -n 20 test.txt    (显示文件结尾20行)

    touch:创建文件(同时创建多个后面跟多个文件名即可)

    touch test2.txt

    mkdir:创建目录

    用法:mkdir  ceshi

    mkdir -p one/two/three  (递归创建目录)

    mv:移动文件或目录

    用法:mv test.txt one    (将test.txt 移动到one目录下面)

    grep:筛选数据

    用法:grep 123 test.txt    在test.txt文件中筛选123

    -i:忽略大小写

    -n:显示行号

    -v:只显示文本不在的行

    -r:在所有子文件和子目录里面查找

    还可以匹配正则  grep -E ^123 test.txt    查找以123开头的行

    sort:排序

    -r:倒序排列

    -R:随机排序

    -n:对数字排序

    wc:文件统计

    wc test.txt  返回值依次为:行数  单词数  字节数

    -l:统计行数

    -w:统计单词数

    -c:统计字节数

    -m:统计字符数

    uniq:删除文件中重复的内容(原文件不会改变,只是输出的会删除)

    cut:剪切文件的一部分

    -c:根据字符数剪切

    cut -c 2-4 test.txt  (test.txt 文件每行只保留第2到第4个字符)

    -d:分割符(例如CSV文件 ,分割符被分为n列)

    -f:区域(例如CSV文件,被分为n列后的某一列或某几列-f 1或-f 1,3或-f 2-或-f 2-5)

    >和>>:重定向到文件

    用法:cut -d , -f 2 test.csv > test1.txt  (会覆盖源文件的内容)

              cut -d , -f 2 test.csv >> test1.txt    (会追加到源文件的末尾)

        2>,2>>,2>&1:重定向错误输出

            文件描述符    名字         解释

                    0            stdin        标准输入

                    1            stdout       标准输出

                    2            stderr        标准错误输出

            示例1:

                cat not_exist_file.csv > results.txt 2> errors.log

                > results.txt :将标准输出重定向到 results.txt 文件中;

                2> errors.log :将标准错误输出重定向到 errors.log 文件中。

            示例2:

                cat not_exist_file.csv > results.txt 2>&1

                2>&1 :将标准错误输出重定向到与标准输出相同的地方。

            示例3:

                cat not_exist_file.csv >> results.txt 2>&1

                将标准输出和标准错误输出都重定向到文件末尾,只需改前面的符号2>&1保持不变

    <和<<从文件或键盘读取

    cat < test.txt  从文件读取

    wc -m << haha  从键盘读取,wc -m统计字符数,当键盘输入haha后结束

    |管道,连接两个命令,命令1 | 命令2,命令1的输出->命令2的输入

    用法:cut -d , -f 2 test.csv | sort >> test.txt

    date:查看时间

    ps:进程的静态列表

    ps -ef 列出所有进程

    ps -u qingclass 列出qingclass用户运行的进程

    ps -aux 通过CPU和内存使用过滤进程

    ps -aux --sort -pcpu  通过CPU使用率降序排列

    ps -aux --sort -pmem  通过内存使用率降序排列

    top:查看进程的动态列表

    kill:结束进程

    kill 1233  (1233为进程PID)

    kill -9  1233    (强制结束进程)

    &:在后台运行进程

    control+z:暂停进程转到后台

    bg:使进程转到后台

    fg:使进程转到前台

    fg 1 或者  fg %1    将编号为1 的进程转到前台

    相关文章

      网友评论

          本文标题:初识shell

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