• 菜鸟教程之学习Shell script笔记(上)


    菜鸟教程之学习Shell script笔记

    以下内容是,学习菜鸟shell教程整理的笔记
    菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.html

    Shell简介

    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
    Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
    Shell脚本(shell script),是一种shell编写的脚本程序。
    业界所说的shell通常是指shell脚本,但是shell和shell script是两个不同的概念。shell包括shell script和开发shell本身。一般实际生产操作过程中用的是shell编程,编写特定功能的shell script用来解决实际问题。

    Shell环境

    Bash:Bourne Again Shell (free and simple to use)
    Bash是大多数Linux使用的system默认shell
    一般情况下并不区分Bourne Shell 和 Bourne Again Shell,所以像#!/bin/sh 可以改为#!/bin/bash,#! 告诉系统其后路径指定的程序即是解释此脚本文件的shell程序。

    Shell命令

    • $ echo "hello world" #输出命令
    • 运行shell脚本的两种方法:
      ./test.sh
      /bin/sh test.sh or /bin/php test.php #直接以解释器运行,就不需要在第一行指定解释器信息。

    Shell变量

    • 和C语言的命名规则差不多,需要注意的是,不能使用标点符号,不能使用bash里的关键字(可用help命令查看保留的关键字)
    • 定义使用变量
      your_name="xxx"
      echo $your_name
      echo ${your_name} #变量名后面的花括号用来明确变量的边界
    • 只读变量
      使用readonly命令可以将变量变为只读变量
      readonly xxx
    • 删除变量
      unset xxx #unset 命令不能删除只读变量

    Shell字符串

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

    • str='this is a string'
      your_name='runoob'
      双引号里面可以有变量,可以出现转义字符
    • 拼接字符串:
    your_name="shell"  
    # 使用双引号拼接  
    greeting="hello, "$your_name" !"  
    greeting_1="hello,${your_name} !"
    echo $greeting $greeting_1
    # 使用单引号拼接
    greeting_2='hello, '$your_name' !'
    greeting_3='hello, ${your_name} !'
    echo $greeting_2 $greeting_3
    
    • 输出结果
    hello, shell ! hello, shell !
    hello, shell ! hello, ${your_name} !
    
    • 获取字符串长度
    string="abcd"
    echo ${#string} #在字符串前面加#就可以实现
    
    • 提取子字符串
      从第2个字符开始截取4个字符
     string="shell is great"
     echo ${string:1:4} #输出 hell
    
    • 查找子字符串
      用 expr index 实现
      查找字符i或a的位置(哪个字母先出现就计算哪个)
    string="shell is great"
    echo `expr index "$string" io` # 输出 7 (空格也算字符)
    

    Shell数组

    bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

    • 定义数组
    数组名={value0 value1 valuue2....} or array_name=(
        value0
        value1
        value2
        value3
    ) #也可以单独定义:
    array_name[0]=value0
    array_name[1]=value1
    array_name[2]=value2
    
    • 读取数组
    一般格式:${数组名[下标]}
    vuluen=${array_name[n]}
    使用@符号可以读取数组中所有的元素
    echo ${array_name[@]}
    
    • 获取数组的长度
    # 取得数组元素的个数
    length=${#array_name[@]}
    # 或者
    length=${#array_name[*]}
    # 取得数组单个元素的长度
    length=${#array_name[n]}
    
    • Shell注释
      用#号实现单行注释
      用:<<EOF .... EOF 实现多行注释,EOF 可以换成其它字母 如‘ or !

    Shell传递参数

    #!/bin/bash
    echo "Shell 传递参数实例!"
    echo "执行的文件名:$0";
    echo "第一个参数为:$1";
    echo "第二个参数为:$2";
    echo "第三个参数为:$3";
    eg:./test.sh 1 2 3
    

    只会传递存在的参数个数,如果输入的是./test.sh 1 2 3 4 则4不会被输出

    $# $* $@ 的作用及区别
    #!/bin/bash
    echo "Shell传递参数实例!";
    echo "第一个参数为:$1";
    echo "参数个数为:$#";
    echo  "传递的参数作为一个字符串显示:$*";
    echo "-- $* 演示 --";
    for i in "$*"; do
        echo $i
    done
    echo "-- $@ 演示 --";
    for i in "$@"; do
        echo $i
    done
    
    执行脚本,输出结果如下所示:
    Shell 传递的参数实例!
    执行的文件名:./test.sh
    第一个参数为:1
    第二个参数为:2
    第三个参数为:3
    参数个数是:3
    传递的参数作为一个字符串显示:1 2 3
    --$* 演示 --
    1 2 3
    -- $@ 演示 --
    1
    2
    3
    
    $*与$@区别:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)
    
    • $$ :脚本运行的当前进程ID号
    • $- :显示Shell使用的当前选项,与set命令功能相同
    • $? :显示最后命令退出的状态 0表示没有错误 其他任何值表明有错误
    • Linux set命令用于设置shell set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。语法:set [+-abCdefhHklmnpPtuvx] -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曾启动的参数。
    • 也可以在配置文件里修该Linux shell set
      全局配置文件(都在/etc/目录下,etc为environment config缩写):
      /etc/profile(不推荐修改)——每个用户在登录时都会调用
      /etc/bashrc(推荐在此处设置全局环境变量,只对bash有效)——每个用户在bash打开时都会调用
      /etc/paths(推荐在此处配置全局环境变量)——写法为一行一个路径,其他配置文件中可通过如下形式追加PATH:【export PATH=$PATH:[path1]:[path2]:[path3]……:[pathN] 】

    用户配置文件:(都在~/家目录下)

    ~/.bash_profile(推荐在此处配置用户环境变量,只对bash有效)——当前用户登录时调用

    ~/.bashrc(推荐在此处配置用户环境变量,只对bash有效)——当前用户bash打开时调用

    Shell数组

    • 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。
      与大部分编程语言类似,数组元素的下标由0开始。
      Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
    array_name=(value1 value2)
    
    • 使用下标定义数组
    array_name[0]=value0
    array_name[1]=value1
    array_name[2]=value2
    
    • 读取数组
    ${array_name[index]}
    
    • 使用@ or *可以获取数组中的所有元素
    #!/bin/bash
    my_array[0]=A
    my_array[1]=B
    my_array[2]=C
    my_array[3]=D
    echo "数组的元素为:${my_array[*]}"
    echo "数组的元素为:${my_array[@]}"
    
    • 获取数组的长度
    用${#xxx[* or @]}获取数组的长度
    eg:
    #!/bin/bash
    my_array[0]=A
    my_array[1]=B
    my_array[2]=C
    my_array[3]=D
    echo "数组元素个数为:${#my_array[*]}"
    echo "数组元素个数为:${#my_array[@]}"
    
    $ ./test.sh
    数组元素个数为:4
    数组元素个数为:4
    
  • 相关阅读:
    TCP粘包,产生的原因以及解决方案
    php判断变量是否为正整数
    php函数trim中文编码问题解决
    win10设置开机自动启动vagrant虚拟机
    Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
    git push 时 fatal: Unable to create 'D:/phpStudy/WWW/green_tree/.git/index.lock': File exists.解决办法
    git push 提示 Everything up-to-date
    Allowed memory size of 134217728 bytes exhausted (tried to allocate 2 bytes)
    访问远程mysql数据库,出现报错,显示“1130
    改变网页选中文本的颜色
  • 原文地址:https://www.cnblogs.com/hudunkey/p/10274724.html
Copyright © 2020-2023  润新知