zoukankan      html  css  js  c++  java
  • linux -shell

    什么是shell
    • Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux
    的桥梁,用户的大部分工作都是通过Shell完成的。
    • Shell既是一种命令语言,又是一种程序设计语言。 作为命令语言,
    它交互式地解释和执行用户输入的命令;作为程序设计语言,它
    定义了各种变量和参数,并提供了许多在高级语言中才具有的控
    制结构,包括循环和分支。
    Shell有两种执行命令的方式:
    • 交互式( Interactive):解释执行用户的命令,用户输入一条命
    令, Shell就解释执行一条。
    • 批处理( Batch):用户事先写一个Shell脚本(Script),其中有很
    多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲
    命令。
    常见的几种shell
    • Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本。
    • Unix/Linux上常见的Shell脚本解释器有bash、 sh、 csh、 ksh等,习惯上把它们称作
    一种Shell。我们常说有多少种Shell,其实说的是Shell脚本解释器。
    bash
    • bash是Linux标准默认的shell, bash由Brian Fox和Chet Ramey共同完成,是
    BourneAgain Shell的缩写,内部命令一共有40个。
    sh
    • sh 由Steve Bourne开发,是Bourne Shell的缩写, sh 是Unix 标准默认的shell。
    csh
    • csh 是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共
    有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说, csh
    其实就是tcsh
    ksh
    ash等等
    • 注意: bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于
    Bourne shell,吸收了C shell和Korn shell的一些特性。 bash完全兼容sh,也就是
    说,用sh写的脚本可以不加修改的在bash中执行。
    第一个shell脚本
    • 新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本的执行,
    见名只意就好。
    • vi test.sh
    • #!/bin/bash
    • echo “hello world”
    • #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一
    种Shell, echo命令用于向窗口输出文本。
    • 运行shell的两种方法
    • 作为可执行程序运行
    • chmod +x test.sh #加上可执行权限
    • ./test.sh
    • 通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到
    正确的解释器。
    • 作为解释器的参数运行
    • bash test.sh
    Shell变量
    • Shell 支持自定义变量
    • 定义变量时,变量名不加美元符号( $)
    name='besttest'
    • 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有
    编程语言都不一样,同时还得遵循以下规则:
    • 首个字符必须为字母( a-z, A-Z)。
    • 中间不能有空格,可以使用下划线( _)。
    • 不能使用标点符号。
    • 不能使用bash里的关键字(可用help命令查看保留关键字) 。
    • 使用变量,使用变量时前面加上一个美元符号($)或者${name},
    即可
    • echo ${name}
    Shell特殊变量
    • Shell有很多特殊的变量,它们在shell中也有特殊的含义
    变量 含义
    $$ 当前Shell进程ID,就是这个脚本的pid
    $0 当前文件名
    $n 取传递给脚本的参数, n是一个数字, n是几就
    取第几个参数
    $# 取参数的个数
    $@ 取所有参数, 被双引号(" ")包含时,与 $* 稍有
    不同
    $* 取所有参数
    $? 最后命令的退出状态, 0表示没有错误,其他
    任何值表明有错误
    Shell算数运算
    • + - * / % 分别对应加、减、乘、除、取余
    • 只需将特定的算术表达式用“ $((” 和“ ))” 括起来,例如:
    a=$((4-2)) a的值为2
    a=10
    b=2
    echo $(($a+$b))
    echo $(($a-$b))
    echo $(($a*$b))
    echo $(($a/$b))
    echo $(($a%$b))
    Shell关系运算符
    运算

    说明 举例
    -eq 检测两个数是否相等,
    相等返回 true。
    [ $a -eq $b ]
    -ne 检测两个数是否相等,
    不相等返回 true。
    [ $a -ne $b ]
    -gt 检测左边的数是否大
    于右边的,如果是,
    则返回 true。
    [ $a -gt $b ]
    -lt 检测左边的数是否小
    于右边的,如果是,
    则返回 true。
    [ $a -lt $b ]
    -ge 检测左边的数是否大
    等于右边的,如果是,
    则返回 true。
    [ $a -ge $b ]
    -le 检测左边的数是否小
    于等于右边的,如果
    是,则返回 true。
    [ $a -le $b ]
    关系运算符列表
    Shell关系运算符
    布尔运算符列表
    算符 说明 举例
    !
    非运算,表达式为
    true 则返回 false, 否
    则返回 true。
    [ ! false ] 返回 true。
    -o
    或运算,有一个表达
    式为 true 则返回 true。
    [ $a -lt 20 -o $b -gt
    100 ] 返回 true。
    -a
    与运算,两个表达式
    都为 true 才返回 true。
    [ $a -lt 20 -a $b -gt
    100 ] 返回 false
    Shell关系运算符
    字符串运算符列表
    运算符 说明 举例
    ==
    检测两个字符串是否相
    等,相等返回 true。 [ $a == $b ] 返回 false。
    != 检测两个字符串是否相
    等,不相等返回 true。 [ $a != $b ] 返回 true。
    -z
    检测字符串长度是否为0,
    为0返回 true。 [ -z $a ] 返回 false。
    -n
    检测字符串长度是否为0,
    不为0返回 true。 [ -n $a ] 返回 true。
    str 检测字符串是否为空,
    不为空返回 true。 [ $a ] 返回 true。
    Shell关系运算符
    文件测试运算符列表
    操作符 说明 举例 -d file 检测文件是否是目录,如果是,则返
    回 true。 [ -d $file ] 返回 false。 -f file
    检测文件是否是普通文件(既不是目
    录,也不是设备文件),如果是,则
    返回 true。 [ -f $file ] 返回 true。 -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。 -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。 -x file 检测文件是否可执行,如果是,则返
    回 true。 [ -x $file ] 返回 true。 -s file 检测文件是否为空(文件大小是否大
    于0),不为空返回 true。 [ -s $file ] 返回 true。 -e file 检测文件(包括目录)是否存在,如
    果是,则返回 true。 [ -e $file ] 返回 true。
    Shell注释和单引号双引号
    • 注释:
    • 以“ #”开头的行就是注释,会被解释器忽略
    • Shell中没有多行注释, 只能每一行加一个#号
    • 单引号
    • 单引号字符串的限制:
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效
    的;
    • 单引号字串中不能出现单引号
    • 双引号
    • 单引号字串中不能出现单引号
    • 双引号里可以出现转义字符
    Shell字符串操作
    • 定义字符串
    • 字符串定义可以用单引号,也可以用双引号,也可以不用引号
    • a=„besttest‟ b=“besttest” c=besttest
    • 拼接字符串
    • 把一个字符串跟到另一个字符串后面即可,例如:
    • name=“besttester"
    • say="hello, "$name" !“
    • say1="hello, ${name} !"
    • say2 = hello,${name}!
    • echo $say $say1 $say2
    • 获取字符串长度
    • #来获取字符串的长度
    • str = „besttest‟
    • echo ${#str}
    • 获取字符串的某个元素
    • str = „besttest is a good school‟
    • echo ${s:1:4}
    Shell数组操作
    • 定义数组
    • 在Shell中,用括号来表示数组,数组元素用“空格” 符号分隔开,不像其他语言中用
    逗号分隔, shell中只支持一维数组,数组的下标可以不连续。
    • 例如:
    • array = (value1 value2 … )
    • array = (value
    value1
    value2)
    • 也可以通过下标赋值的方式来定义一个数组
    • list[0]=1
    • list[8]=9
    • 数组的取值方式:
    • ${array_name[index]}
    • ${list[0]}
    • 使用@ 或 * 可以获取数组中的所有元素, 例如
    • ${list[*]}
    • ${list[@]}
    • 获取数组长度的方法与获取字符串长度的方法相同,使用#,例如:
    • len = ${#list[*]}
    Shell的if判断 • if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。 Shell 有三种 if ... else 语句: • if ... fi 语句; • if ... else ... fi 语句; • if ... elif ... else ... fi 语句。 • if ... else 语句的语法: • if [ expression ] then Statement(s) else Statement(s) fi
    • if ... elif…else…fi 语句的语法: • if [ expression ] then Statement(s) elif [expression ] then Statement(s) else Statement(s) fi
    if判断实例
    • 用if来写一个简单的小脚本
    • 判断一个脚本是否有执行权限,如果没有的话,给它加上可以执行的
    权限,如果没有这个脚本的话,创建一个
    • #!/bin/bash
    file='/root/my.sh'
    if [ -x $file ]
    then
    chmod +x $file
    else
    touch $file
    chmod +x $file
    fi
    Shell的case esac判断
    • case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。
    • case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。 case语句格
    式如下: case 值 in
    模式1) command ;;
    模式2) command ;; *) Command ;; esac
    • case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。
    取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直
    至 ;;。 ;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。
    • 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再
    继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
    case esac判断实例
    • 用case esac来写一个简单的小脚本
    • 根据输入的参数来判断,输入r的话执行一个脚本,输入c的话创建一
    个脚本,输入d的话删除这个脚本,输入其他的都执行这个脚本
    • #!/bin/bash
    num=$1
    case $num in
    x)
    chmod +x my.sh
    ;;
    d)
    rm -rf my.sh
    ;;
    c)
    touch my.sh
    ;;
    *)
    bash my.sh
    ;;
    esac
    Shell的for循环
    • for循环一般格式为:
    for 变量 in 列表
    do
    command1
    command2
    ...
    commandN
    done
    for循环实战
    • 做一个小练习,用for和if,遍历/root目录下的所有文件,打印出来可执行
    的文件
    #!/bin/bash
    path='/root'
    for file in $path/*
    do
    if [ -x $file -a -f $file ]
    then
    echo $file
    fi
    done
    Shell的while循环
    • while循环用于不断执行一系列命令,也用于从输入文件中读取数
    据;命令通常为测试条件。其格式为:
    while 条件
    do
    command
    done
    • 例如:
    a=1
    while [ $a -lt 5 ]
    do
    echo $a
    a=$(($a+1))
    done
    while循环实战
    • 做一个小练习,用while写一个计算累加和的脚本,输入一个数字,算它的
    累加和。
    #!/bin/bash
    num=$1
    i=0
    sum=0
    while [ $i -le $num ]
    do
    sum=$(($sum+$i))
    i=$(($i+1))
    done
    echo "$sum"
    Shell中的函数
    • 在shell脚本中可以定义并使用函数
    • 其定义格式为:
    function 函数名( )
    {
    命令表
    return xx
    }
    • 函数应先定义,后使用
    • 调用函数时,直接利用函数名,如showfile,不必带圆括号
    • shell脚本与函数间的参数传递可利用位置参数和变量直接传递
    • 通常,函数中的最后一个命令执行之后,就退出被调函数。也可利
    用return命令

  • 相关阅读:
    PAT 1006 Sign In and Sign Out
    PAT 1004. Counting Leaves
    JavaEE开发环境安装
    NoSql数据库探讨
    maven的配置
    VMWARE 下使用 32位 Ubuntu Linux ,不能给它分配超过3.5G 内存?
    XCODE 4.3 WITH NO GCC?
    在苹果虚拟机上跑 ROR —— Ruby on Rails On Vmware OSX 10.7.3
    推荐一首让人疯狂的好歌《Pumped Up Kicks》。好吧,顺便测下博客园可以写点无关技术的帖子吗?
    RUBY元编程学习之”编写你的第一种领域专属语言“
  • 原文地址:https://www.cnblogs.com/lingxia/p/5889058.html
Copyright © 2011-2022 走看看