• 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命令

  • 相关阅读:
    javascript 笔记
    小程序组件 Vant Weapp 安装
    vue学习笔记——脚手架安装
    [二分] [计算几何] AtCoder Beginner Contest 144 D Water Bottle
    [单调队列][前缀和][滑窗][Codeforces] Round #594 (Div. 2) D1 The World Is Just a Programming Task
    [Codeforces] 592 div2 A B D E
    [Codeforces] Round #595 (Div. 3) A B1 B2 C1 C2 D1 D2 E
    [Codeforces] Global Round 5 A C1 C2 D
    [主席树单点更新区间极值动态开点][最长上升子序列] CodeForces 474 F. Pathwalks
    [思维]挖矿
  • 原文地址:https://www.cnblogs.com/lingxia/p/5889058.html
Copyright © 2020-2023  润新知