Shell详解

shell脚本

 

变量

shell允许用户建立变量存储,但不支持数据类型(所有数据只认为是字符串)"="号左右不能有空格
变量尽量大写,便于区分

声明:
KEY=value
KEY2=`命令` // 动态转换 命令置换 
KEY3=$KEY
输出:
echo $KEY

删除变量赋值 unset
unset KEY


env 当前环境变量

 

 

位置变量

    $0  // 与键入的命令行一样,包含脚本文件名
    $1,$2...$9 // 分别包含第一个到第九个命令行参数
    ${10}  // 两位数以后需要用括号括起来
    $#  // 包含命令行参数的个数
    #@ // 包含所有命令行参数:"$0,$1....$9"
    $?  // 包含前一个命令的退出状态
    $*  //  包含所有命令行参数:"$0,$1....$9"
    $$      // 包含正在执行的进程id号

 

程序和语句

说明性语句(以#开始到结束,不被执行)

****特殊:第一行指定使用什么shell执行

#! /bin/sh

 

功能性语句(任意的shell命令,用户程序或其他的shell程序)

read从标准输入读入一行,并赋值给后面的变量
read var1 #把读入的数据全部赋给var
read var1 var2 var3 #把读入的第一个内容赋给var1,第二个赋值给var2,其余的都给var3
#如果执行read语句时标准输入无数据,则程序在此等候,直到数据的到来或被终止

expr算数运算命令,包括加(+)、减(-)、乘(\*)、除(/)、求模(%) 每一个运算符左右必须使用空格隔开
expr 12 + 1 \* 3

 

 

结构性语句(条件测试、多路分支语句、循环语句、循环控制语句)

条件测试

test语句可以测试三中对象:字符串、整数、文件属性 (0为真1位假)

    例如:
        test `$answer` = yes # 变量answer的值是否为字符串yes
        test $num -eq 18  # 变量num的值是否为整数18
        test -d tem # 测试tep是否为一个目录名

 

字符串:

=、!=、-z(判断长度是否为0)、-n(判断长度是否不为0)

 

整数:

-eq(相等)、-ne(不相等)、-gt(大于)、-ge(大于等于)、-lt(小于)、-lt(小于等于)

 

文件:

-d name(测试name是否为一个目录)、

-e name(测试文件是否存在)、

-f name(测试是否为普通文件)、

-L name(测试是否为符号链接)、

-r name(测试文件是否存在且为可读)、

-w name(测试文件是否存在且可写)、

-x name(测试文件是否存在且可执行)、

-s name(测试文件是否存在且长度不为0)、

f1 -nt f2(测试f1是否比f2跟新)、

f1 -ot f2(测试f1是否比f2更旧)

 

 

分支语句

条件语句

if [ 表达式 ]
  then 命令表 #如果表达式为真执行then后的命令表,命令表可以是一条,也可以是多条
fi

 

 

Demo:
#!/bin/bash
if [ $# -ne 1 ]
then
    echo "$0 filename"
fi

 

多条件语句

if [ 表达式 ]
  then 命令表 #如果为真返回
elif [表达式]
  then 命令表 #如果为真返回
....
else
  命令表 #反之执行
fi

 

 

 

case分支

    case 字符串变量 in
        模式1)
            命令表1
            ;;  #终止符
        模式2|模式3) #条件或
            命令表2
            ;;
        ...
        模式n)
            命令表n
            ;;
        *)  #default
            命令表*
    esac

 

 

循环语句

for循环 

变量依次取单词表中的各个单词,每取一次执行一次循环体中的命令,循环次数由单词表中的单词数确定,命令表中的命令可以是一条,也可以是以分号或者换行符分开的多条

    for 变量名 in 单词表
        do
            命令表
        done

 

Demo:
    for I in 1 3 5 7 9    # 配合seq使用:seq 起始数 步长 终点 #生成数列 步长可以省略
    do
        echo "$I"
    done
    
for循环2
    for ((变量声明;执行条件;变量修改))
    do
        命令表
    done
    
Demo:
    for ((I=1;I<=10;I++))
    do
        echo "$I"
    done
    
Demo:
    for ((;;)) #无限循环
    do    
        echo "for"
    done

 

 

while循环

while循环测试命令或表达式的值,如果为真就执行循环体的内容直到为假退出;while语句的退出状态为命令表中被执行的额最后一条命令的退出状态

    while 命令或表达式
        do
            命令表
        done

 

循环控制语句

break、continue

 

函数

函数的调用格式

方式1
value_name=`function_name[args1 args2 ...]` #所有的标准输出都传递给主程序的变量
方式2
function_name[args1 args ...]
echo $? #所有输出都被$?吸收

 

函数定义

    function_name(){
        代码块
    }

demo

function_name()
{
  echo $1
  return $1  #可以省略
}
TXT=1
function_name $TXT
echo $? #获取到return值

 

posted @ 2020-05-02 10:22  Binb  阅读(238)  评论(0编辑  收藏  举报