Shell使用

shell脚本 代码规范
    #!/bin/bash    --shell脚本必备开头!!,在此之下所有的#都是注释
    echo "输出内容"
    :wq        --保存退出

脚本执行
    需要先赋予脚本文件权限
    chmod 755 文件名
    chmod +x ./文件名    --赋予权限
    ./文件名        --执行脚本
    
    bash 文件名    --通过bash方式执行脚本
shell变量
    变量命名规范:由数字、字母、下划线组成,不能以数字开头,不得有空格或其他符号,不能使用bash关键字
    注:变量名与等号之间不可以有空格
    如:name="zhangsan"

    除了可以用=号可以给变量赋值外,还可以用用语句赋值
    如:for name in "zhangsan"; do
        echo $name
           done        
    
    使用变量
    echo ${变量名}
    获取字符串长度需再变量名前加#
    如:echo ${#变量名}
    
    数组:变量名=(值1 值2 值3...)
    中间使用空格分割
    
    读取数组方式:
    echo=${变量名[下标]}
    echo=${变量名[@]}    --表示获取数组中所有元素
    获取数组长度与字符串类似在变量名前加#
    如:echo ${#变量名[下标]}

多行注释
    将需要注释的代码用花括号括起来,定义为一个函数,没有调用这个函数就不会被执行,达到注释的效果
    如:
    :<<!
    注释内容...
    注释内容...
    注释内容...
    !

传递参数
    脚本内获取参数的格式为$n,n代表数字,1就是第一个参数,2就是第二个参数以此类推,$0为执行发文件名
    特殊字符:
    $#:传递到脚本的参数个数
    $* :以字符串的形式显示所有向脚本传递的参数 
    $$ :脚本当前运行的进程号
    $@:  与$*相同,但是使用时加引号,并在引号中返回参数个数

运算符
    原生bash不支持运算符,所以通过其他命令来实现:awk\expr
    expr用法:
    表达式和运算符之间要有空格,例如2+2是错误的,需写做2 + 2,
    完整的表达式需要用``,反引号包含(ESC下边)。
    如:int=`expr 2 + 2`
    算术运算符:
    +    加法
    -    减法
    *    乘法(使用乘法时*前需要使用\才可以生效,如:`expr $1 \* $2`)
    /    除法
    %    取余
    =    赋值
    ==    相同,比较两个数字,相同返回true
    !=    不同,比较两个数字,不同返回true

    条件语句写法:
    if [ $a == $b ]
        then
        echo "相同"
    else
        echo "不相同"
    fi

    关系运算符:
    关系运算符只支持数字不支持字符串,除非字符串的值是数字
    
    -eq    检测两个数是否相等,相等返回true
    -ne     检测两个数是否不相等,不相等返回true
    -gt    检测左边的数是否大于右边的,如果是,返回true
    -lt    检测左边的数是否小于右边的,如果是,返回true
    -ge     检测左边的数是否大于等于右边的,如果是,返回true
    -le    检测左边的数是否小于等于右边的,如果是,返回true

    布尔运算符
    !    非运算,表达式为true则返回false,否则返回true
    -o    或运算,表达式为true则返回true
    -a    与运算,两个表达式都为true才返回true

    逻辑运算符
    &&     等同于-a
    ||    等同与-o
    
    if判断使用“||”或“&&”需要有两个独立的[],如[[]]或(())
    if(( a>b ))&&(( a<c ))
    if[[ $a-gt$b && $alt$c ]]
    
    字符串运算符
    =    检测两个字符串是否相等,相等返回true
    !=    检测两个字符串是否不相等,不相等返回true
    -z    检测字符串长度是否为0,为0返回true
    -n    检测字符串长度是否不为0,不为0返回true
    $    检测字符串长度是否为空,不为空返回true

    文件测试运算符
    -b file    检测文件是否是块设备文件,如果是,返回true
    -c file    检测文件是否是字符设备文件,如果是,返回true
    -d file    检测文件是否是目录,如果是,则返回true
    -f file    检测文件是否是普通文件(既不是目录也不是设备文件),如果是,则返回true
    -g file    检测文件是否设置了SGID位,如果是,返回true
    -k file    检测文件是否设置了粘着位(Bticky Bit),如果是,返回true
    -p file    检测文件是否是有名管道,如果是,返回true
    -u file    检测文件是否设置了SUID位,如果是,返回true
    -r file     检测文件是否可读,如果是,返回true
    -w file    检测文件是否可写,如果是,返回true
    -x file     检测文件是否可执行,如果是,返回true
    -s file    检测文件是否为空(文件大小是否大于0),不为空返回true
    -e file     检测文件(包括目录)是否存在,如果是,则返回true

shell echo命令
    显示普通字符串:
    echo "xxx"
    可省略双引号
    echo xxx
    输出结果一致
    
    显示转义字符
    echo "\"xxx\""
    输出结果: "xxx"
    
    显示变量
    read命令从标准输入中读取一行,并吧输入行的每个字段的值指定给shell变量
    -p    提示信息,在等待输入read时,输出提示信息
    -t    秒数,read会在设定的时间执行
    -n    字符数,read接收到指定的字符数就会执行
    -s    隐藏输入的数据

    显示换行
    echo -e "OK! \n"    #-e 开启转义
    echo "It is a test"
    显示不换行
    echo -e "OK !\c"     #-e 开启转义,-c 不换行
    echo "It is a test"

    echo `date`    显示当前日期
    
    echo -e         特殊字符处理符
    若字符串中出现以下字符,则需特别加以处理,而不会将它当作文字输出:
    \a        发出警告声
    \b        删除前一个字符
    \c        最后不加上换行符号
    \f        换行但光标停留在原来的位置
    \n        换行且光标移至行首
    \r        光标移至行首但不换行
    \t        插入tab
    \v        与\f相同
    \插入\字符
    \nnn        插入nnn(八进制)所代表的ASCII字符

printf命令
    printf语法:
    printf format-string [arguments...]
    format-string:为格式控制字符串
    arguments:为参数列表    
    
    格式替代符:
    %s    输出一个字符串
    %d    整型输出
    %c    输出一个字符
    %f    输出实数,以小数的形式输出
    %-10s     指一个宽度为10的字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果
        不足则自动以空格填充,超过也会将内容全部显示出来。
    %-4.2f    指格式化为小数,其中.2值保留两位小数。

    printf的转义序列
    \a    警告字符
    \b    后退
    \c    不显示输出结果中的任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数
        里的字符,任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
    \f    换页
    \n    换行
    \r    回车
    \t    水平制表符
    \v    垂直制表符
    \\    一个字面上的反斜杠字符
    \ddd    表示1到3位数的八进制值的字符,仅在格式字符串中有效
    \0ddd    表示1到3位的八进制值字符

shell流程控制
    在shell中在if\else中如果没有语句执行,就不要写当前else

    for循环
    
    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
    done

    while循环
    while循环用于不断执行一系列命令,也用于从输入文件中读取数据。
    
    while condition
    do
        command
    done

    
    
    死循环格式:
    while :
    do
        command
    done
    或
    while true
    do
        command
    done
    或
    for (( ; ; ))
    
    跳出循环
    break命令运行跳出所有循环(终止执行后边的所有循环)
    
    continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

    case...esac
    case...esac为多选择语句,每个case分支用右括号开始,用两个分号;;表示break,即执行结
    束,跳出整个case...esca语句,esac作为结束标记
    可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
    case ... esac语法格式如下:
    case 值 in
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;    
    esac    

shell 函数
    linux shell可以定义函数。然后在shell脚本中可以随意调用。
    shell中函数定义格式如下:
    [ function ] funname [()]

    {

    action;

    [return int;]

    }

    1、可以带function fun()定义,不带任何参数。
    2、参数返回,可以显示加:return返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值n(0-255)。

    函数返回值在调用该函数后通过$?来获得。
    注意:所有函数在使用前必须将函数放在开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其
    函数名即可。
    $?仅对上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不能再通过$?获得。
    
shell输入\输出重定向
        command>file    将输出重定向到file。
        command>>file    将输出以追加的形式重定向到file。
        command<file    将输入重定向到file。
        
        注:0表示标准输入,1表述标准输出,2表示标准错误输出。

        command1< infile> outfile
        同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。

shell文件包含
        shell可以包含外部脚本。

        . filename        注:. 和文件名中间要有一个空格
        或
        source filename

##和%%表示最长匹配,#和%表示最短匹配。键盘上#在%前面,所以#是对左边部分处理,%是对右边部分处理。

shell中##处理的是文件指定样式左侧部分,%%处理的是文件指定样式右边的部分。

下面我们以一个例子来进行说明。

在/home/shell/a/b/c下有一文件test.sh


DIR=/home/shell/a/b/c/test.sh

1、删除“.”左边的部分,即获取文件名后缀。

此处由于只有一个“.”,所以“##*.”和“#*.”实现的效果是一样的。


2、删除最后一个“/”左边的部分,即获取文件名。


3、删除第一个“/”左边的部分。


4、删除第一个“/”右边的部分,相当于清空结果。


5、删除最右边的“/”及右边的部分,及获取文件所在路径。


6、删除“.”右边的部分,即去除文件后缀名。

此处由于只有一个“.”,所以“%%.*”和“%.*”实现的效果是一样的。


那么,后期我们使用shell,在条件判断或者字符串拼接处理的时候,尤其是对文件名的处理的时候,我们就
可以使用##或者%%来实现我们需要的结果。具体需要达到什么样的效果根据我们的需要而定,然后我们采用对应的裁剪符号来处理即可。

shell中 =~ 与 == 的区别:
正则匹配,用来判断其左侧的参数是否符合右边的要求,如果匹配则为真,不匹配则为假。

=~支持正则表达式,同时支持变量比较相等。==只能支持比较变量相不相等。

可知:如果需要做两个变量的包含关系,可以使用=~匹配

shell exit0与exit1的区别:
    exit0代表正常运行程序并退出
    exit1代表非正常运行程序并退出
    
    目的是在程序退出后可以通过echo $?来查看是0还是1,从而达到检查程序是正常结束退出,还是非正常退出。

set
    set命令用于设置shell的执行方式,可依照不同的需求来设置。
    参数:
    -a  标示已修改的变量,以供输出至环境变量。
    -b  使被中止的后台程序立刻回报执行状态。
    -C  转向所产生的文件无法覆盖已存在的文件。
    -d  Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
    -e  若指令传回值不等于0,则立即退出shell。
    -f   取消使用通配符。
    -h  自动记录函数的所在位置。
    -H Shell  可利用"!"加<指令编号>的方式来执行history中记录的指令。
    -k  指令所给的参数都会被视为此指令的环境变量。
    -l  记录for循环的变量名称。
    -m  使用监视模式。
    -n  只读取指令,而不实际执行。
    -p  启动优先顺序模式。
    -P  启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
    -t  执行完随后的指令,即退出shell。
    -u  当执行时使用到未定义过的变量,则显示错误信息。
    -v  显示shell所读取的输入值。
    -x  执行指令后,会先显示该指令及所下的参数。
    +<参数>  取消某个set曾启动的参数。    

shell map
    https://blog.csdn.net/m0_67393342/article/details/124019151
    
    1.定义map
    declare -A 变量名(-A必须大写,-a是数组)
    
    2.取出value
    echo ${map[@]}
    echo ${map[@]}
    
    3.取出所有keys
    echo &{!map[@]}
    echo &{!map[*]}
    
    4.map赋值,更改
    map["hello"]="isu"
    
    5.取值
    echo ${map["hello"]}
    
    6.map的遍历
    for key in ${!map[*]}
    do
        echo ${map[$key]}
    done

shell里面的PATH
    PATH用于是一个目录路径,用于保存操作系统搜索运行程序,如果将要运行的程序不在当前目录,操作系统会根据
    Path变量中记录的目录去依次搜索,如果在这些目录中可以找到待运行的程序,程序可以正常运行,否则失败。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值