• shell-变量,字符串,数组,注释,参数传递


    Linux的Shell有很多种,常见的有Bourne Shell Bourne Again Shell C Shell K Shell Shell for Root
    等,其中Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用,本系列文章就是基于B Shell进行探究的

    linux命令集成

    之前所讲的的linux命令,例如ls,cat,mkdir等等,都可以在shell里面得到执行
    这里补充几个之前没提到但又比较有用的命令

    • 查看文件最后num行
      tail -n num filename

    • 查看文件最开始的num行
      head -n num filename

    • 改变创建目录的默认权限(使用777减去设置的值就是默认的权限)
      umask 026

    • 改变文件的所属
      chown user.group filename
      chown user filename
      chown .group filename

    shell命令简单示例

    #!/bin/bash
    echo "Hello Shell"
    

    以上就是一个简单的shell脚本示例
    新建文件,按约定一般shell脚本后缀名为sh,这并不是一定的,因为Linux对于文件的识别并不是通过后缀名
    后缀名对于Linux并没有作用,这样写是为了方便,算是一种行业规定,并非一定

    文本开头的#!是一个约定的标记,用来告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell
    echo 命令用于向窗口输出文本

    shell可以直接运行,也可以作为输入源来运行
    直接运行的话,需要将sh脚本赋予执行权限
    作为输入源,需要使用/usr/sh来执行
    前一种方式比较常见

    Shell 变量

    变量说明

    在shell中,变量名和其他编程语言类似,变量名遵循字母数字下划线,数字不能开头
    变量不需要指定类型,定义即可

    key="test"
    

    这里有一点值得注意,在其他编程语言中,往往为了美观,会在赋值号左右加上空格,而在shell中这样的做法是不可以的

    变量赋值

    在shell中,变量的赋值有两种方式
    显示的赋值,例如

    key="test"
    

    语句赋值,shell可以使用其他语句的结果为变量赋值

    for file in `ls /etc`
    

    变量使用

    使用一个变量,在变量名前面添加$符号,表示要获取这个变量的值

    key="test"
    echo $key
    

    当变量与其他混合在一起,可以使用{}定义变量的边界

    key_1="test1"
    key_2="test"
    echo ${key_1}{key_2}
    

    此处如果不对边界加以区分,那么编译器将$以后当作变量,其输出的结果就不是预期值了

    变量的一些细节

    定义过的变量可以重新赋值
    这也很好理解,在一般编程语言里面,变量的定义需要类型,再次赋值则不需要,而在shell里面是没有这种规定的,那么定义一个变量以后,要修改这个变量的值,那么只能和定义看上去一样了,从这个角度来说,有些资料说变量可以重定义,我认为说法是不准确的,这里准确来说应该是赋值

    key="test1"
    echo $key
    key="test2"
    echo $key
    

    只读变量与删除变量

    变量可以为只读,只需在前面加上readonly即可,只读变量的值一旦被定义,那么就不能修改

    key="test"
    readonly key
    

    变量可以被删除,使用unset删除一个变量
    删除的变量不能再被使用

    key="test"
    unset key
    

    注意:unset不可以删除只读变量

    Shell 字符串

    字符串可以用单引号,也可以用双引号,也可以不用引号

    单引号

    单引号类的字符会保持原样,怎么写的就怎么用
    例如存在变量key,在单引号中存在$key,那么他就是一个$key,与key变量没有任何关系

    string='string test'
    

    反引号一般也用于命令的执行,其等价于$()

    双引号

    双引号与单引号最大的区别在于单引号不可以有变量,而双引号可以,同时还可以存在转义字符

    string="string test"
    

    单双引号都可以对字符串进行拼接

    key=" key "
    str1="test"$key"ok"
    str2="test${key}ok"
    str3='test'$key'ok'
    

    字符串操作

    • 获取字符串长度
      使用字符串的同时,在字符串变量前面加上#可以获取其长度
    string="test"
    echo ${#string}
    
    • 提取子字符串
      在要提取的字符串后面加上:可以获取其字串
    string="test"
    echo ${string:1:2}
    
    • 查找子字符串
      使用反引号定义其语句
      查找字符es的位置(哪个字母先出现就计算哪个)
    string="test"
    echo `expr index "$string" es`
    

    Shell 数组

    bash只支持一维数组(不支持多维数组),没有限定数组的大小
    和其他语言一样,其可以通过下标来得到数组值,下标从0开始

    定义数组

    数组名=(值1 值2 ... 值n)
    数组值之间通过空格隔开

    testarr=(1 2 3 4)
    

    其下标可以不连续,没有范围限制

    读取数组

    ${数组名[下标]}
    和一般变量使用类似

    key=${test_arr[0]}
    

    可以使用*@来获取数组中的所用元素

    echo ${test_arr[*]}
    echo ${test_arr[@]}
    

    获取数组的长度

    数组长度

    len=${#test_arr[@]}
    len=${#test_arr[*]}
    

    元素长度

    len=${#test_arr[n]}
    

    Shell 注释

    单行注释

    shell通过#进行注释

    #这是一个注释
    #这也是一个注释
    

    多行注释

    shell中的多行注释,使用:<<开始,其后面添加一个标志,然后在注释完成的地方再加一个同样的标志

    :<<EOF
    test
    test
    test
    EOF
    

    Shell 参数传递

    Shell脚本在执行的时候可以对其传递参数
    可以使用$n对其传递的参数接收
    例如执行test.sh 1 2 3,在test.sh内可以使用$0代表程序本身,$1代表第一个参数
    这和C语言main函数的参数接收是一样的

    参数处理 说明
    $# 传递到脚本的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    $@ $*相同,但是使用时加引号,并在引号中返回每个参数
    $- 显示Shell使用的当前选项,与set命令功能相同
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
  • 相关阅读:
    javaweb学习(十一)—— 使用Cookie进行会话管理
    微信小程序授权登录-获取用户信息-手机号信息-及解密碰到的坑
    mysql数据库乱码问题,数据库和程序链接过程中查询和显示出现中文乱码
    javaWeb项目启动加载java类执行自己想要执行的操作
    spring mvc 把事物处理配置到Controller层
    maven项目外网向内网搬迁问题之找不到本地仓库已经有的jar包
    java 解析json 的各种jar包
    jquery ui 插架 之 dataTable 显示横向滚动条
    jsp spring Mvc前台提交数据到后天乱码
    java cs tab点击切换标签的实现 panel
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664692.html
Copyright © 2020-2023  润新知