善用搜索

shell编程基础实践教程

shell基础理论

图形界面或命令(dos/shell/hdfs-dfs)/程序->系统api->系统->硬件
#shell
    #what
        #是一个环境,提供了对linux(unix)系统的接口
        #向你接收输入,并根据输入执行程序,并显示程序的输出
        #可以运行我们的命令,程序和shell脚本
classification
    #就行有不同类型得系统一样,shell也有不同版本,每个版本都有自己得一套命令1和功能
    unix shell写于20世纪70年代中由斯蒂芬伯恩,在新泽西AT&T贝尔实验室
    Bourne shell. 提示符$后面跟命令行参数
    C shell.        提示符%

shell脚本

#命令列表中列出的顺序执行
    #创建->编辑->保存
    [root@single shell]# vi three.sh
    [root@single shell]# ls
    three.sh
    
    #!/bin/bash        命令开头必须要使用
    :<<!
    echo -n "hello kb10"
    echo "hello kb11"
    !
    esc :x/w 
    
    #修改权限
    ls -la
    -rw-r--r--. 1 root root   31 Nov 23 09:06 three.sh
    chmod u+x test.sh
    -rwxr--r--. 1 root root   31 Nov 23 09:06 three.sh
    #执行
    ./three.sh

shell命令

#echo [-n] "..."    控制台输出
    #read VAR            控制台输入
    #命令行输入
        echo -n "please enter your name => "
        read NAME
        echo "my name is $NAME"
    #控制台输出
        [root@single shell]# ./three.sh
        please enter your name => (王者)手动输入      
        my name is 王者

shell注释

#单行:#...
#多行::<<!  ... !

shell变量

#变量:数字、字母、下划线、一般字母大写
    #值可以是一个数字、文本、文件名、设备或任何其他类型的数据,不可以是指针
    #shell可以创建,分配和删除变量
    #创建
         NAME="henry"
         AGE=18
    #使用
         echo "$NAME,$AGE"
    #命令
         NAME="henry"
        AGE=18
        echo "$NAME,$AGE"
    #控制台
        [root@single shell]# ./three.sh
        henry,18

    #取消/删除
         unset NAME
    #命令
        NAME[0]="zs"
        NAME[1]="ls"
        unset NAME
    #控制台
        [root@single shell]# ./three.sh
        [root@single shell]# 

常量

readonly FINAL="1001"

\#变量分类

局部变量:当前实例有效
    环境变量:跨实厉访问
    当前登录有效的临时环境变量
    export VAR
    export -f  代表[变量名称]中为函数名称
    export -p        #列出所有的shell赋予程序的环境变量
    export -n         #删除环境变量VAR变量实际上并未删除,只是不会输出到后续指令的执行环境中。
    export VAR        #添加环境变量VAR

shell变量命令符:

        $$        当前shell进程编号
        $0        当前脚本的文件名
        $n        脚本参数        如:./one.sh henry 18,则脚本中的$1为henry
        $#        脚本参数得到数量    如上:2
        $*        脚本参数的完整集合    如上:henry,18
        $@        脚本参数的独立集合    如上:henry,18
        # $* vs $@
        # 不加""两者相同
        #加上""则$*代表整体,而$@代表个体
        
        $?        上一条命令的执行结果状态值或函数的返回值;0表示正常,1表示失败1
        $!        The process number of the last background command.

shell数组

#标准变量:保持一个类型一值的变量
    #数组:支持不同类型的变量,可以在同一时间容纳多个值
    #创建赋值
        NAME=(aa 18 true)
        NAME[0]="henry"
        NAME[1]="pola"
        NAME[2]="ariel"
    #使用
        echo $NAME        #首元素
        echo ${NAME[0]}    #第一个元素
        echo ${NAME[1]}    
        echo ${NAME[2]}
        echo ${NAME[*]}    #所有元素
        echo ${NAME[@]}    
        echo ${NAME[0]}    #数组长度
    #命令行
        NAME=(aa 18 true)
        NAME[0]="henry"
        NAME[1]="pola"
        NAME[2]="ariel"
        echo $NAME              
        echo ${NAME[0]}
        echo ${NAME[1]} 
        echo ${NAME[2]}
        echo ${NAME[*]}
        echo ${NAME[@]} 
        echo ${NAME[0]}
    #控制台
        [root@single shell]# ./three.sh
        henry
        henry
        pola
        ariel
        henry pola ariel
        henry pola ariel
        henry

shell运算符

#算术运算符

    #shell早期未设计算术,但可以在外部程序awk或expr
    #expr expr与运算符和其他值之间【必须有空格】,所有的算术计算,使用整数
        #*需要转译 、*
        #不支持小数计算
            VAL=`expr 2 + 2`
            let "VAL=2**3"
            VAL=$((2+3))
            echo $VAL
            #+ - * / % = ++ --
            [ 2 == 2 ]    #=>true
            [ 2 != 2 ]    #=>false
            var=`expr 2 + 3`
        #命令行输入
            echo $var
            var=`expr 2 - 3`
            echo $var
            var=`expr 2 \* 3`
            echo $var
            var=`expr 2 / 3`
            echo $var
            var=`expr 2 % 3`
            echo $var
        #控制台输出
            [root@single shell]# ./three.sh
            5
            -1
            6
            0
            2

\#关系运算符

# -eq -ne -lt -le -gt -ge

\#布尔运算符

# ! -o -a
        [ 2 -lt 3 -o 5 -gt 3]
# || &&
    [[ 2 < 3 || 5 > 3 ]]

\#字符串运算符

#二元:== != =~
#命令行输入
    if [ $1 == "henry" ]
    then
            echo "is henry"
    else
            echo "is not henry"
    fi
    
    
    if [[ $1 =~ ^[0-9]+$ ]]
    then
            echo "is henry"
    else
            echo "is not henry"
    fi

    [[ $var =~ PATTERN ]]
    不加\"

\#正则匹配

^        开始
$        结束
.        一个任意字符
[]        指定范围    [abc][0-9][^a-b1-9]
\<        单词开始
\>        单词结束
\b        单词开始或结束
\B        非单词开始或结束
?        {0,1}
+        {1,}
*        {0,}
{n,m}    最少n次,最多m次
{n,}    最少n次
{,m}    最多m次
{f}        固定f次
\        转义符
()        组合
|        或
#一元:-z(是否为空) $str(是否不为空)
#文件测试操作(一元左置)
    #-e -d -f -r -w -x -s (not empty)
#命令行输入
if [ -r $1 ]
then
        echo "radeable"
else
        echo "unreadable"
fi

\#特殊表达式

``<=>$()            #命令替换符,兼容性``更好

OUTPUT=`start-all.sh`
先执行start命令,执行完把结果赋值给OUTPUT,默认有线程等待,延时加载
...

(())                #算术运算加强版
# && ||
# ++ -- **

$(()) <=> $[]        #算术运算,$(())中变量可以加$也可以不加

[]                    #test命令
[[]]                #字符串计算加强版

${}
    ${STR#*WORD}            
    #若STR符合WORD,将最短(WORD和左侧)的删除<=>${STR%WORD}(WORD和右侧)
#命令行输入
    VAR="/opt/software/hadoop/a.txt"
    VAR=${VAR%/*}
    echo $VAR
#控制台输出
    [root@single shell]# ./three.sh
    /opt/software/hadoop

    ${STR##*WORD}            
    #若STR符合WORD,将最长(WORD和左侧)的删除<=> ${STR%WORD}(WORD和右侧)
#命令行输入
    VAR="/opt/software/hadoop/a.txt"
    VAR=${VAR##*/}
    echo $VAR
#控制台输出
    a.txt
    
    ${STR/WORD/REPLACE}        
    #若STR符合WORD,将第一个匹配项替换为REPLACE
    #命令行输入
    VAR="/opt/software/opt/a.txt"
    VAR=${VAR/opt/123}
    echo $VARopt
    #控制台输出
    [root@single shell]# ./three.sh
    /123/software/opt/a.txt

    ${STR//WORD/REPLACE}
    #若STR符合WORD,将所有匹配项替换为REPLACE
    #命令行输入
    VAR="/opt/software/opt/a.txt"
    VAR=${VAR//opt/123}
    echo $VAR
    #控制台输出
    [root@single shell]# ./three.sh
    /123/software/123/a.txt

    ${STR:-DE_VALUE}        #若STR未赋值或为空置,则设定STR值为DF_VALUE
    #命令行输入
    STR=(12)
    echo ${STR:-DE_VALUE}
    #控制台输出
    [root@single shell]# ./three.sh
    12

    ${ARRAY[IX]}            #获取数组ARRAY下标IX的元素
    #命令行输入
    ARR=(henry 12 wsdf 严旭) 
    echo ${ARR[2]}
    #控制台输出
    [root@single shell]# ./three.sh
    wsdf

    ${#ARRAY[@]}            #获取数组ARRAY的长度(ITEM1 ITEM2...)
    #命令行输入
    ARR=(henry 12 wsdf 严旭) 
    echo ${#ARR[@]}
    #控制台输出
    [root@single shell]# ./three.sh
    4

    ${ARRAY[*]}                #整个数组
    #命令行输入
    ARR=(henry 12 wsdf 严旭) 
    echo ${ARR[*]}
    #控制台输出
    [root@single shell]# ./three.sh
    henry 12 wsdf 严旭
发表评论
退出移动版