三、Linux——Shell脚本语言

【1】shell的三种类型

    shell 命令
    shell 命令解释器
    shell 脚本:shell命令的有序集合

【2】创建

    1、创建一个以.sh结尾的文件
    2、赋予可执行权限
    3、执行

【3】chmod

                rw-  rw- r--
     二进制      110  110 100
     八进制      6    6   4
     chmod 776 1.sh

【4】变量

    1--- 用户自定义变量
                    1、没有类型
                    2、赋值时等号两边禁止有空格
                    3、echo "$A"
    2--- 位置变量
                    $0... ...$n(两位以上要加花括号 ${10})
                    命令行的位置参数
    3--- 预定义变量
                    $*  $@  :所有命令行参数,除第一个以外
                    $#         :命令行参数的个数,除第一个以外
                    $$         :PID
                    $?         :与上一条shell命令有关
                         1、承接上一条命令的执行状态  成功$?= 0
                         2、用于测test语句的结果真$?=0,假$?=1
                         3、承接函数的返回值
     4--- 环境变量
                     $HOME

【5】功能语句

        1--- read从标准输入读入一行,并依次赋值给后面的变量
                剩余的数据甩给最后一个变量
        2--- expr
                    +    -   \*    /     %      \(     \)
                     1、表达式的格式 `expr $A + 1`
                     2、运算符两边必须留有空格

        3--- test
            0、测试的结果使用$?承接
            1、测字符串
                     =  :是否等于
                    !=  :是否不等
                     -z :是否为空
                     -n  :是否为非空
            2、测整数
                 -eq     -ne     -gt     -ge       -lt     -le  
                相等      不等     大于   大于等于    小于     小于等于

            3、文件
                1>文件类型
                    linux   b       c     d     -     l      s       p      
                    shell  -b      -c    -d    -f    -L     -S      -p
                2>权限
                        用户本身的权限
                            -r -w -x                                
                3>其他
                        -e name       测试一个文件是否存在
                        -s name    测试name文件是否存在且不为空
                        f2 -nt f2      测试文件f1 是否比文件f2 更新
                        f2 -ot f2   测试文件f1 是否比文件f2更旧
                4>test 可以用[]替代,注意与数据保留一个空格

【6】if

         if      表达式
             then  
                 命令表
             fi     

        *******************

         if      表达式
             then 
             命令表1
             else  
             命令表2
             fi

        *******************
         if      表达式
         then   
             命令表1
         elif    表达式
         then   
             命令表2
         else   
             命令表3
         fi

【7】case

          case  变量   in
              模式1)
                       命令表1
                        ;;
              模式2|3)   
                       命令表2
                        ;;
              *)
                       命令表n
                        ;;
           esac

【8】while

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




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

【10】函数

        function   function_name ( )
         {
                command1
                ……
                commandn
         }

        1、function 是关键字
        2、调用:function_name  arg1 arg2 arg3
        3、参数:$1 …… $n
        4、返回:return $val               //返回值是整数    
        5、$? 承接函数的返回值
        6、变量默认是全局的,local使其变为局部的

【11】

        -o  or或
        -a  and与

        exit    结束程序           

源码及注释

1、1_val.sh

#! /bin/bash 
#注释
A=hello   #赋值=两边不能有空格

echo "A = $A"   #取值要用$

#命令行参数
echo "\$0 = $0"
echo "\$1 = $1"
echo "\$2 = $2"

echo "\$10 = ${10}"   #两位以上要加花括号

#预定义变量

echo "\$* = $*"   #除第一个参数后面的所有
echo "\$@ = $@"   #同上
echo "\$# = $#"   #除第一个参数的个数

echo "\$$ = $$"   #进程PID
echo "\$? = $?"   #承接上一条命令的执行结果,正确输出0

2、2_read.sh

#! /bin/bash 
#read 从标准输入读入一行,并依次赋值给后面的变量
#剩余数据甩给最后一个变量
read A B C
echo "A = $A"   
echo "B = $B"
echo "C = $C"

read D E
echo "D = $D"
echo "E = $E"

3、3_expr.sh

#! /bin/bash 
#计算表达式 expr格式

A=10

A=`expr $A + 10 \* 2`   #``tab键上方位置 符号两边留有空格需要
echo "A = $A"

read A
A=`expr \( $A + $1 \) \* 2`  #*、()需要转义符号  
echo "A = $A"

4、4_test_char.sh

#! /bin/bash 

A=hello
B=hello

test $A = $B
echo "\$1 = $?"  #AB是否相等

test $A != $B   #AB是否不等
echo "\$2 = $?"

test $A = "HELLO"  
echo "\$3 = $?"

test -n $A       #是否非空
echo "\$4 = $?"

test -z $A       #是否空
echo "\$5 = $?"

C=""
test -z $C
echo "\$6 = $?"

5、5_test_int.sh

#! /bin/bash 

A=10
B=12

test $A -eq $B
echo "\$?1 = $?"

test $A -ne $B
echo "\$?2 = $?"

test $A -lt $B
echo "\$?3 = $?"

test $A -gt $B
echo "\$?4 = $?"

test $A -le $B
echo "\$?5 = $?"

test $A -ge $B
echo "\$?6 = $?"

6、6_test_file.c

#! /bin/bash 
test -d .
echo "\$?1 = $?"

>8.sh
test -f ./8.sh
echo "\$?2 = $?"

ln -s 8.sh link
test -d link
echo "\$?3 = $?"

test -w 8.sh
echo "\$?4 = $?"

[ -x 8.sh ]
echo "\$?5 = $?"

[ 1.sh -nt 8.sh ]
echo "\$?6 = $?"
rm ./8.sh ./link

7、7_if.sh

#! /bin/bash 

read A

if [ $A -gt 100  -o  $A  -lt 0 ]
then
    echo "error"
    exit
fi

if [ $A -le 100  -a  $A -ge 90 ]
then
    echo "A"
fi

if [ $A -le 89  -a  $A -ge 80 ]
then
    echo "B"
fi

if [ $A -le 79  -a  $A -ge 70 ]
then
    echo "C"
fi

if [ $A -le 69  -a  $A -ge 60 ]
then
    echo "D"
fi


if [ $A -le 59  -a  $A -ge 0 ]
then
    echo "E"
fi

echo "end"

8、8_elif.sh

#! /bin/bash 


read A

if [ $A -eq 0 ]
then
    echo "等于0"
elif [ $A -gt 0 ]
then
    echo "大于0"
else
    echo "小于0"
fi

9、9_case.sh

#! /bin/bash 

read A

case $A in
    H|h)
        echo "hello"
        ;;
    W|w)
        echo "world"
        ;;
    O)
        echo "other"
        ;;
    *)
        echo "**"
        ;;
esac

10、10_case_sorce.sh

#! /bin/bash 

read A

if [ $A -gt 100 -o $A -lt 0 ]
then
    exit
fi

A=`expr $A / 10`

case $A in
    10|9)
        echo "A"
        ;;
    8)
        echo "B"
        ;;
    7)
        echo "C"
        ;;
    6)
        echo "D"
        ;;
    *)
        echo "E"
        ;;
esac

11、11_while.sh

#! /bin/bash 

A=6

while [ $A -gt 0 ]
do
    A=`expr $A - 1`

    if [ $A -eq 2 ]
    then
    #   break
        continue
    fi

    echo "A = $A"
    sleep 1
done

B=10
while [ $B -ne 0 ]
do
    >file$B.txt
    B=`expr $B - 1`
done

12、12_for_in.sh

#! /bin/bash 

i=0

for A in hello world beijing shanghai
do
    echo "A = $A"
    i=`expr $i + 1`
done

echo "i = $i"

13、13_for_MAX.sh

#! /bin/bash 

MAX=$1

for A in $@             //巧用预定义变量
do
    if [ $MAX -lt $A ]
    then
        MAX=$A
    fi
done

echo "MAX = $MAX"

14、14_for_cp.sh

#! /bin/bash 

#1、创建一个目录dir,存在则提示exist 不存在则创建
#2、将当前路径下所有的普通文件拷贝到dir
#3、将拷贝的文件名记录在1.txt文件内

if [ -d dir ]     #判断文件夹是否存在
then
    echo "exist"
else
    mkdir dir
fi

for file in `ls`     #巧用命令置换,ls结果当参数
do
    if [ -f $file ]
    then
        cp $file dir
        echo "$file" >> 1.txt
    fi
done

15、15_fun.sh

#! /bin/bash 

function fun()   #声明一个函数
{
    local A=8       # A=8 默认全局,local A=8 局部
    echo "fun"
    echo "\$0 = $0"
    echo "\$1 = $1"
    echo "\$@ = $@"
    echo "\$# = $#"
    return $A
}

fun world beijing 123   #传参
echo "\$? = $?"
echo "A = $A"

你可能感兴趣的:(三、Linux——Shell脚本语言)