zoukankan      html  css  js  c++  java
  • (一)Linux Shell编程——简介、变量、字符串、数组

    1. Shell简介

    1.1 Shell出现背景

    Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件。

    对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。

    由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell

    1.2 Shell作用

    Shell 除了能解释用户输入的命令,将它传递给内核,还可以:

    • 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果;
    • 在多个程序之间传递数据,把一个程序的输出作为另一个程序的输入;
    • Shell 本身也可以被其他程序调用。

    由此可见,Shell 是将内核、程序和用户连接了起来。
    Shell 本身支持的命令并不多,但是它可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。

    常见的 Shell 有 sh、bash、csh、tcsh、ash 等。这里使用Linux默认的bash shell (兼容sh),对其他Shell不加探究。

    2. Shell语法

    2.1 helloWorld及授权

    编写shell脚本,输出hello world

    [root@centoszang testShell]# vim myShell.sh 
    
    #!/bin/bash
    echo "hello world!!!"

    通过上面代码,可以看出:“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令用于向窗口输出文本。

    编写之后,运行该文件会提示权限不够

    [root@centoszang testShell]# ./myShell.sh
    -bash: ./myShell.sh: 权限不够

    授给该文件x(执行)权限

    [root@centoszang testShell]# chmod 744 ./myShell.sh 
    [root@centoszang testShell]# ls -l
    总用量 4
    -rwxr--r--. 1 root root 34 6月  10 20:47 myShell.sh

    输入该脚本文件的相对路径和绝对路径都可以执行该脚本

    [root@centoszang testShell]# ./myShell.sh 
    hello world!!!
    [root@centoszang testShell]# /home/testShell/myShell.sh 
    hello world!!!

    2.2 Shell变量

    2.2.1 Shell变量分类

    Shell变量分为环境变量和用户自定义变量(局部变量)。

    局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量;环境变量是所有的程序,包括shell启动的程序都能访问的变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

    2.2.2 变量定义

    在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

    v1=hello
    v2='hello'   #如果 value 包含了空白符,那么就必须使用引号包围起来
    v3="hello"   #解析变量的话需要加双引号

    赋值号的周围不能有空格。

    2.2.3 变量使用

    address="中关村"
    echo $address
    echo ${address}
    echo "海淀${address}百度大厦"

    变量的使用是通过 "$var",“${var}”的方式来调用,推荐给所有变量加上花括号{ },这是个良好的编程习惯。

    2.2.4 单引号和双引号的区别

    name=" world!!!"
    v1='hello ${name}'   
    v2="hello ${name}"   #解析变量的话需要加双引号
    echo "v1 is ${v1}"
    echo "v2 is ${v2}"

    执行上面代码,通过输出可以看出单引号和双引号的区别

    [root@centoszang testShell]# ./myShell.sh 
    v1 is hello ${name}
    v2 is hello  world!!!

    2.2.5 将命令的结果赋值给变量

    variable=`ls`   #`非'
    echo ${variable}
    variable=$(ls)
    echo ${variable}

    第一种方式把命令用反引号包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

    2.2.6 删除变量

    name="world"
    unset name
    echo ${name}   #无输出

    2.2.7 只读变量

    readonly name="world"    #声明方式一:直接声明
    
    address="中关村"
    readonly address         #声明方式二:定义之后再声明
    
    echo "name is ${name} and address is ${address}"
    
    name="hello"   #修改变量值
    unset address   #删除变量

    通过执行输出可以看到,只读变量不能修改和删除。

    [root@centoszang testShell]# ./myShell.sh 
    name is world and address is 中关村
    ./myShell.sh: line 9: name: readonly variable
    ./myShell.sh: line 10: unset: address: cannot unset: readonly variable

    2.3 特殊变量

     通常来讲,变量名只能包含数字、字母和下划线,某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。

    2.3.1 $* 和 $@ 的区别

    $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

    echo "$*=" $*
    echo ""$*"=" "$*"
    echo "$@=" $@
    echo ""$@"=" "$@"
    
    echo "print each param from $*"
    for var in $*
    do
        echo "$var"
    done
    echo "print each param from $@"
    for var in $@
    do
        echo "$var"
    done
    echo "print each param from "$*""
    for var in "$*"
    do
        echo "$var"
    done
    echo "print each param from "$@""
    for var in "$@"
    do
        echo "$var"
    done

    输出

    [root@centoszang testShell]# ./tsbl.sh a b c
    $*= a b c
    "$*"= a b c
    $@= a b c
    "$@"= a b c
    print each param from $*
    a
    b
    c
    print each param from $@
    a
    b
    c
    print each param from "$*"
    a b c
    print each param from "$@"
    a
    b
    c

    2.3.2 退出状态

    $? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

    2.4 Shell替换

    2.4.1 转义字符

    如果表达式中包含特殊字符,Shell 将会进行替换。例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。

    a=10
    echo -e "Value of a is $a 
    "
    echo "Value of a is $a 
    "

    输出

    [root@centoszang testShell]# ./myShell.sh 
    Value of a is 10 
    
    Value of a is 10 
    

    常用转义字符如下

    2.4.2 变量替换

    变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。

     

    echo ${var:-"Variable is not set"}
    echo "1 - Value of var is ${var}"
    
    echo ${var:="Variable is not set"}
    echo "2 - Value of var is ${var}"
    
    unset var
    echo ${var:+"This is default value"}
    echo "3 - Value of var is $var"
    
    var="Prefix"
    echo ${var:+"This is default value"}
    echo "4 - Value of var is $var"
    
    echo ${var:?"Print this message"}
    echo "5 - Value of var is ${var}"

    结果

    [root@centoszang testShell]# ./myShell.sh 
    Variable is not set
    1 - Value of var is 
    Variable is not set
    2 - Value of var is Variable is not set
    
    3 - Value of var is 
    This is default value
    4 - Value of var is Prefix
    Prefix
    5 - Value of var is Prefix

    2.5 Shell字符串

    2.5.1 单双引号

    Shell中最常用的数据类型就是字符串了,字符串可以用单引号,也可以用双引号,也可以不用引号。学过拍黄片的会发现,单双引号的区别跟PHP类似。

    my_name='Richard'
    hello_word="Hello, I know your are "$my_name"! 
    "

    之前已介绍过了,这里再整理一下

    单引号字符串的限制:

    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

    双引号的优点:

    • 双引号里可以有变量
    • 双引号里可以出现转义字符

    2.5.2 拼接字符串

    your_name="Jenny"
    greeting="hello, "$your_name" !"
    greeting_1="hello, ${your_name} !"

    2.5.3 获取字符串长度

    string="abcd"
    echo "the length of string is ${#string}" #输出 4

    2.5.4 截取字符串

    string="alibaba is a great company"
    echo ${string:1:4} #输出liba

    2.5.6 查找子字符串

    string="alibaba is a great company"
    echo `expr index "$string" is`      #输出3
    echo `expr index "$string" 'is'`     #输出3
    echo `expr index "$string" "is"`    #输出3

    这里发现Shell该语法只截取第一个字符的位置。

    2.6 数组

    2.6.1 定义数组

    定义数组有如下三种方法

    my_array=(arr1 arr2 arr3)
    
    your_array=(
    arr1
    arr2
    arr3
    )
    
    our_array[0]=arr1
    our_array[1]=arr2
    our_array[2]=arr3

    2.6.2 读取数组

    echo "my_array[0] is ${my_array[0]}"  #读取单个元素
    echo "all of your_array's elements are ${your_array[*]}"  #读取所有元素
    echo "all of our_array's elements are ${our_array[@]}"     #读取所有元素

    2.6.3 获取数组长度

    # 取得数组元素的个数
    length=${#our_array[@]}   #3
    # 或者
    length=${#our_array[*]}   #3
    # 取得数组单个元素的长度
    length=${#our_array[2]}   #4
  • 相关阅读:
    SQLSERVER FUNCTIONS
    批处理命令学习
    java回调
    android布局中容易混淆的几个属性
    UML类图关系
    android面试试题
    Handler基础
    Android中自定义属性的使用
    php中钩子函数&实现
    Handler高级
  • 原文地址:https://www.cnblogs.com/zjfjava/p/9164085.html
Copyright © 2011-2022 走看看