• 【Linux】shell脚本和bat脚本:



    一、脚本对应环境:
    【1】shell:linux环境;后缀名为.sh

    主要用在linux中,而linux系统对应的shell又有很多,如Bourne Shell(/usr/bin/sh或/bin/sh),又如Bourne Again Shell(/bin/bash)由于Bourne Again Shell(/bin/bash)免费且易用,故使用较多。
    对应的脚本文件后缀名为.sh。
    注:
    #!告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。如#!/bin/sh,#!/bin/bash,通常放于脚本文件首行。

    【2】bat:windows环境;后缀名为.bat或者.cmd

    主要用于windows中,又名批处理文件,其每一行指令都是一条dos指令,对应脚本文件后缀名为.bat或者.cmd。

    二、脚本执行:
    【1】shell执行

    1.直接在bash命令窗口执行shell相关命令。
    2.将shell命令保存为文件,执行文件就可以运行shell命令。
    注:由于在linux中对文件的权限管理较细,故如果使用shell脚本文件,必须使其具有可执行权限,对脚本授权chmod +x ./文件名.sh #使脚本具有执行权限,执行脚本./test.sh #执行脚本,./必须加,因为当前文件没有加入到linux的path中,linux仅只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 path中。

    【2】bat脚本执行

    1.直接在windows的dos窗口即cmd窗口执行bat相关命令。
    2.将bat命令保存为bat文件,在windows中文件权限限制没有linux中那么严格,故相关bat脚本文件可以直接双击执行或者命令行执行

    三、脚本相关命令:
    1. shell命令
    【1】shell变量
    #!/bin/bash
    # 定义变量如下,变量名和等号之间不能有空格
    name="变量定义"
    # 变量使用,使用一个定义过的变量,只要在变量名前面加美元符号即可
    echo $name
    # 变量外面的花括号是为了区分边界,加不加都可以
    echo ${name}  # $只在使用变量的时候加,再次赋值不加
    
    #使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
    name="哈哈哈"
    readonly name
    name="修改只读变量"  # 报错/bin/sh: NAME: This variable is read only.
    
    # 使用 unset 命令可以删除变量,变量被删除后不能再次使用,unset 命令不能删除只读变量。
    name="旺旺旺"
    unset name  # 删除name变量
    echo ${name} # 无输出
    
    # 字符串可以使用单引号'',也可以使用双引号"",也可以不用引号
    # 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的,可以用作字符串拼接使用
    # 双引号里可以有变量,也可以出现转义字符
    name_one='单引号'
    name_one_p='单引号拼接,'${name_one}'拼接结束'
    echo ${name_one_p}    # 输出:单引号拼接,单引号拼接结束
    name_two="双引号"
    name_two_p1="双引号拼接1,${name_two}拼接结束"
    name_two_p2="双引号拼接2,"${name_two}"拼接结束" 
    echo ${name_two_p1} ${name_two_p2}  #输出:双引号拼接1,双引号拼接结束 双引号拼接2,双引号拼接结束
    
    # 获取字符串长度,变量为数组时,${#arr} 等价于 ${#arr[0]}
    name="哈哈哈"
    echo ${#name}    # 输出:3
    
    # 提取子字符串,从第4个字符开始提取2个字符(第一个字符的索引值为 0)
    name="小不点最爱喝兽奶"
    echo ${name:3:2}  # 输出:最爱
    
    # 查找子字符串,查找字符'奶'或'爱'的位置(哪个字母先出现就计算哪个)。这个查找中文有点瑕渍,应该是字符编码问题。
    name="wafenhicfsr"  
    echo `expr index "${name}" cf`  # 输出:3
    
    # 数组:bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
    # 定义数组:用括号来表示数组,数组元素用"空格"符号分割开
    arr=(v1 v2 v3 ... vn)
    arr=(
      lily
      汤姆
      123
    )
    arr[0]=哈哈哈  # 单独定义数组的各个分量
    arr[2]="123"
    arr[n]="nnn"    # 可以不使用连续的下标,而且下标的范围没有限制。
    # 读取数组格式 ${数组名[下标]}
    arr=(lily 汤姆 123)
    echo ${arr[1]}  # 输出:汤姆
    # 使用 @ 符号可以获取数组中的所有元素
    echo ${arr[@]} # 输出:lily 汤姆 123
    # 获取数组的长度
    echo ${#arr[@]}    # 取得数组元素的个数
    echo ${#arr[*]}    # 取得数组元素的个数
    echo ${#arr[1]}    # 取得数组单个元素的长度
    
    # 注释,常用的都是以#为注释
    :<<EOF 注释... EOF
    或
    :<<z 注释 z
    或
    :<<! 注释... !
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    【2】为shell脚本传递参数

    脚本中以$n获取参数, $0 为执行的文件名(包含文件路径),$1接受第一个参数,$2第二个参数…,以此类推

    # 文件名./test.sh
    #!/bin/bash
    echo "shell传参脚本学习"
    echo "执行的文件名:$0"
    echo "第一个参数:$1"
    echo "第二个参数:$2"
    echo "第三个参数:$3"
    echo "传递到脚本的参数个数:$#"
    echo "以\"1参 2参 3参 n参\"的形式输出所有参数:$*"
    echo "脚本运行的当前进程ID号:$$"
    echo "后台运行的最后一个进程的ID号:$!"
    echo "与\$*相同,但是使用时加引号,并在引号中返回每个参数:$@"
    echo "显示Shell使用的当前选项:$-"
    echo "显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误:$?"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    修改test.sh文件为可执行:chmod -x test.sh
    执行test.sh文件:./test.sh 12 哈哈哈 fggg
    执行结果如图:
    在这里插入图片描述

    【3】shell数组

    Bash Shell 只支持一维数组(不支持多维数组),且各值以空格分开

    # 1.普通数组
    arr_ordinary=("lily" 123 "哈哈哈")  # 定义
    echo ${arr_ordinary[1]}    # 访问
    # 2.关联数组(与Map类似):可以使用任意的字符串、或者整数作为下标来访问数组元素。
    # 语法:declare -A array_name, -A 选项就是用于声明一个关联数组。
    declare -A arr_correlation=(["name"]="lily" ["age"]=18 ["sex"]="男")
    # 也可以先声明一个关联数组,然后再设置键和值
    declare -A arr_declare
    arr_declare["name"]="lily"
    arr_declare["age"]=18
    arr_declare["sex"]="男"
    # 使用键来访问数组
    echo ${arr_declare["name"]}
    # 获取数组中所有元素,使用 @ 或 * 可以获取数组中的所有元素
    echo "数组的值为: ${arr_declare[*]}"   
    echo "数组的值为: ${arr_declare[@]}"    # 相当于map中获取所有值value
    echo "数组的键为: ${!arr_declare[*]}"
    echo "数组的键为: ${!arr_declare[@]}"  # 相当于map中获取所有键
    echo "数组元素个数为: ${#my_array[*]}"
    echo "数组元素个数为: ${#my_array[@]}"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    【4】shell运算符
    #【1】算术运算符
    a1=6
    a2=2
    # 1.加,+
    echo `expr $a1 + $a2`  # 输出8
    # 2.减,-
    echo `expr $a1 - $a2`  # 输出4
    # 3.乘,*
    echo `expr $a1 \* $a2`  # 输出12,乘法的*前面必须加\
    # 4.除,/
    echo `expr $a1 / $a2`  # 输出3
    # 5.取余,%
    echo `expr $a1 % $a2`  # 输出0
    # 6.赋值,=
    a1=$a2  # 将变量a2的值赋给a1
    # 7.相等,==,比较两个数字相等返回true
    [ $a1 == $a2 ]  # 不能echo,不能直接使用,必须配合if或者test使用
    # 8.不相等,!=,比较两个数字不相等返回true
    [ $a1 != $a2 ]
    
    #【2】关系运算符
    关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
    且不能直接使用,只能配合if或者test使用
    a1=2
    a2=4
    # 检测两个数是否相等,相等返回 true
    [ $a1 -eq $a2 ]   # 返回false
    # 检测两个数是否不相等,不相等返回 true
    [ $a1 -ne $a2 ]   # 返回 true
    # 检测左边的数是否大于右边的,如果是,则返回 true
    [ $a1 -gt $a2 ]  # 返回false
    # 检测左边的数是否小于右边的,如果是,则返回 true
    [ $a1 -lt $a2 ]  #返回 true
    # 检测左边的数是否大于等于右边的,如果是,则返回 true
    [ $a1 -ge $a2 ]  #返回 false
    # 检测左边的数是否小于等于右边的,如果是,则返回 true
    [ $a1 -le $a2 ]  #返回 true
    
    #【3】布尔运算符
    a1=2
    a2=4
    # 非运算(!),表达式为 true 则返回 false,否则返回 true
    [ ! false ]  # 返回 true
    # 或运算(-o),有一个表达式为 true 则返回 true
    [ $a1 -lt 2 -o $a2 -gt 4 ] 返回 false
    # 与运算(-a),两个表达式都为 true 才返回 true
    [ $a1 -lt 2 -a $a2 -gt 4] 返回 false
    
    #【4】逻辑运算符
    a1=2
    a2=4
    # 逻辑的 AND(&&)
    [[ $a -lt 4 && $b -gt 5]]  # 返回 false
    # 逻辑的 OR(||)
    [[ $a -lt 4 || $b -gt 5]]  # 返回 true
    
    #【5】字符串运算符
    a1="hhh"
    a2="ggg"
    # (=)检测两个字符串是否相等,相等返回 true
    [ $a1 = $a2 ]  # 返回 false
    # (!=)检测两个字符串是否不相等,不相等返回 true
    [ $a1 != $a2 ]  # 返回 true
    # (-z)检测字符串长度是否为0,为0返回 true
    [ -z $a ]  # 返回 false
    # (-n)检测字符串长度是否不为 0,不为 0 返回 true
    [ -n "$a" ]  # 返回 true
    # ($)检测字符串是否不为空,不为空返回 true
    [ $a ]  # 返回 true
    
    #【6】shell输出语句
    1.echo:输出字符串,一般使用情况
    2.printf:格式化输出字符串,功能更强,类似于c语言的输出
    语法为:printf format-string [arguments...]
    如:printf "%-10s %-8s %-5d\n" 姓名 性别 年龄
    
    #【7】test命令
    # 代码中的 [] 执行基本的算数运算
    num1=100
    num2=100
    if test $[num1] -eq $[num2]  # 测出test后面的语句看shell相关运算符
    then
        echo '两个数相等!'
    else
        echo '两个数不相等!'
    fi
    
    #【8】流程控制语句
    #(8.1) if语句
    # 语法如下
    if condition
    then
        command1 
        command2
        ...
        commandN 
    fi
    # 写成一行
    if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
    
    #(8.2) if-else语句
    # 语法如下
    if condition
    then
        command1 
        command2
        ...
        commandN
    else
        command
    fi
    
    #(8.3) if-else-if-else语句
    注:如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 ><
    # 语法如下
    if condition1
    then
        command1
    elif condition2 
    then 
        command2
    else
        commandN
    fi
    
    #(8.4) 循环语句
    #(8.4.1) for循环语法如下
    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done
    # for循环示例,打印1,2,3,4,5
    for item in 1 2 3 4 5
    do
        echo "$item"
    done
    
    #(8.4.2) while循环语句语法
    while condition
    do
        command
    done
    # while循环示例,其中let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
    value=1
    while(( $value<=5 ))
    do
        echo $value
        let "value++"
    done
    
    #(8.4.3) 无限循环语句语法
    while :
    do
        command
    done
    # 或者
    while true
    do
        command
    done
    # 或者
    for (( ; ; ))
    
    #(8.4.4) until 循环
    # 注:until 循环执行一系列命令直至条件为 true 时停止
    until condition
    do
        command
    done
    # 示例,输出 0 ~ 5 的数字
    a=0
    until [ ! $a -lt 5 ]
    do
       echo $a
       a=`expr $a + 1`
    done
    
    #(8.5) 多分枝选择语句
    注:case ... esac 为多选择语句,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记
    # 语法如下
    casein
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac
    # 示例
    read number  # 阻塞并读取用户输入
    case $number in
      1)
      echo "用户输入了$number" ;;
      2)
      echo "用户输入了$number" ;;
      *)
      echo "相当于default执行";;
    esac
    
    #(8.6) break和continue
    在shell中也是使用break和continue跳出循环,含义与其它编程语言类似
    
    #【9】shell函数
    语法与js类似,调用方式稍有不同
    # 语法如下
    [ function ] funname [()]
    {
        action;
        [return int;]
    }
    注:
    1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
    2.参数返回,可以显示加return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
    示例及使用如下
    
    # 在shell脚本中函数必须先定义后使用
    # 函数定义如下
    usemyshellfun(){
        echo "第一个参数为 $1 !"
        echo "第二个参数为 $2 !"
        echo "第十个参数为 $10 !"
        echo "第十个参数为 ${10} !"
        echo "第十一个参数为 ${11} !"
        echo "参数总数有 $# 个!"
        echo "作为一个字符串输出所有参数 $* !"
        return $((2+3))
    }
    # 调用函数并传参
    usemyshellfun 1 2 3 4 5 6 7 8 9 34 73
    # 注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
    
    #【10】shell输入输出重定向
    # 将输出重定向到 file
    command > file
    # 将输入重定向到 file
    command < file
    # 将输出以追加的方式重定向到 file
    command >> file
    # 将文件描述符为 n 的文件重定向到 file
    n > file
    # 将文件描述符为 n 的文件以追加的方式重定向到 file
    n >> file
    # 将输出文件 m 和 n 合并
    n >& m
    # 将输入文件 m 和 n 合并
    n <& m
    # 将开始标记 tag 和结束标记 tag 之间的内容作为输入
    << tag
    一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
    1.标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
    2.标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
    3.标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
    
    # 将错误流stderr 重定向到 file
    command 2>file
    # 将错误流stderr 重定向并追加到 file
    command 2>>file
    # 将输出流stdout 和错误流 stderr 合并后重定向到 file
    command > file 2>&1
    # 追加方式
    command >> file 2>&1
    另:/dev/null 文件
    
    # /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到
    # 将命令的输出重定向到它,会起到"禁止输出"的效果
    
    # 如果希望执行某个命令,但又不希望在屏幕上显示输出结果
    command > /dev/null
    # 如果希望屏蔽 stdout 和 stderr
    command > /dev/null 2>&1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    2. bat命令

    bat相关命令和shell命令有异曲同工之妙,而且bat会比shell使用简单点

    【1】获取和设置相关变量
    # 获取常用变量不需要区分大小写,使用%variable%可以获取变量值
    # 获取当前目录
    echo %cd%
    # 获取命令搜索路径
    echo %path%
    # 获取当前日期
    echo %date%    # 格式:2023/03/22 周三
    # 获取当前时间
    echo %time%  # 格式:14:26:46.97
    # 获取 0 和 32767 之间的任意十进制数字
    echo %random%
    # 获取上一命令执行结果码
    echo %errorlevel%
    
    # 变量设置,与shell有所不同,格式如下
    set [variable=[string]]  #variable表示变量名,string表示变量值
    # 例
    set temp="哇哈哈"
    echo %temp%  # 输出:"哇哈哈"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    【2】字符串操作
    # 字符串截取,命令格式 echo %var:~n,k%,
    # 1."var",表示待截取字符的字符串
    # 2."~"取字符标志符
    # 3."n"表示字符截取起始位置
    # 4."k" 表示截取几位
    set temp="wahaha哇哈哈123"
    echo %temp:~2,3%  # 输出:hah
    echo %temp:~0,-3%  # 输出:wahaha哇哈哈
    
    # 字符串替换,命令格式命令%var:old_str=new_str%
    set replace_str=%temp:123=熏悟空%
    echo %replace_str%  # 输出:wahaha哇哈哈熏悟空
    echo %temp%  # 输出:wahaha哇哈哈123,不改变原值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    【3】bat注释
    rem 注释符,也可以用两个冒号代替(::)
    rem 这是一个注释,此注释不会显示
    
    • 1
    • 2
    【4】bat输出语句
    echo 显示信息,或启用或关闭命令回显。@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态
    # 批处理命令在执行时显示自身命令行
    echo on
    # 批处理命令在执行时不显示自身命令行
    echo off
    # 关闭echo off命令行自身的显示
    @echo off
    # 创建包含字符test的test.txt文件
    echo test > file.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    【5】基本命令
    # 暂停并输出“请按任意键继续. . .”
    pause 等待并提示"请按任意键继续. . ."  # 阻塞窗口,程序执行完以后不会关闭窗口
    pause > nul  # 等待但不出现提示语
    echo wait a moment.. & pause > nul # 输出指定信息并阻塞窗口
    
    # 程序执行结果返回码,执行成功返回0,失败返回为1
    echo %errorlevel%
    
    # 启动一个单独的窗口以运行指定的程序或命令,程序继续向下执行
    start [command/program] [parameters]
    
    # 退出CMD.EXE程序或当前批处理脚本
    # 1./B:指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个批处理脚本外执行,则会退出 CMD.EXE
    # 2.exitCode:指定一个数字号码。如果指定了 /B,将 ERRORLEVEL设成那个数字。如果退出 CMD.EXE,则用那个数字设置过程退出代码
    exit [/B] [exitCode]
    
    # 清除屏幕内容
    cls
    
    # 提供 Windows 命令的帮助信息
    help [command]
    
    # 设置cmd窗口的标题
    title 标题名字
    
    # 设置默认的控制台前景和背景颜色
    # 颜色属性由两个十六进制数字指定:第一个为背景,第二个则为前景
    # 以下任意俩种颜色组合
    #   0 = 黑色       8 = 灰色
    #   1 = 蓝色       9 = 淡蓝色
    #   2 = 绿色       A = 淡绿色
    #   3 = 湖蓝色     B = 淡浅绿色
    #   4 = 红色       C = 淡红色
    #   5 = 紫色       D = 淡紫色
    #   6 = 黄色       E = 淡黄色
    #   7 = 白色       F = 亮白色
    color [attr]  # attr 指定控制台输出的颜色属性
    
    # 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序
    call 路径文件名 标签
    
    # 跳转命令。程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序
    goto label  # label是参数,指定所要转向的批处理程序中的行
    # 例子,打开多个cmd窗口直到资源耗尽
    :label
    start
    goto label
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    【6】语句结构
    ####
    ####1.if语句
    ####
    # if语句实现条件判断,包括字符串比较、存在判断、定义判断等。# # 通过条件判断,if语句即可以实现选择功能。
    /*
    1.字符串比较
      语法格式:if [/i] [not] str1 比较操作符 str2 (相关操作) [else (相关操作)]
      		  有/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非
    比较操作符:
      1.== - 等于
      2.EQU - 等于
      3.NEQ - 不等于
      4.LSS - 小于
      5.LEQ - 小于或等于
      6.GTR - 大于
      7.GEQ - 大于或等于
    */
    # 例子
    set str1=123456
    set str2=abcdef
    if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)
    if /i not %str1%==%str2% (echo 字符串不相同!) else (echo 字符串相同!)
    
    /* 
    2.存在判断:存在判断的功能是判断文件或文件夹是否存在
      语法格式:if [not] exist filename (相关操作) [else (相关操作)]
    */
    # 例子1
    if exist %0 echo 文件%0是存在的!  # %0代表该批处理的全称(包括驱动器盘符、路径、文件名和扩展类型)
    # 例子2
    if not exist %0(
      echo 文件夹%0不存在!
    )else echo 文件夹%0存在!
    
    /*
    3.定义判断:定义判断的功能是判断变量是否存在,即是否已被定义
      语法格式:if [not] defined variable (相关操作) [else(相关操作)]
    */
    # 例子1
    set var=111
    if defined var (echo var=%var%) else echo var尚未定义!
    # 例子2
    set var=% %
    if defined var (echo var=%var%) else echo var尚未定义!
    
    ####
    ####2.for循环语句
    ####
    /*
    1.无开关:无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句
      语法格式:for %%v in (循环值values)  do (相关操作)
    相关解释:
      %%v是批处理程序里面的书写格式,注意v只能是单字符。在DOS中书写为%v,即只有一个百分号(%);values就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的(相关操作)就是循环所执行的命令,即循环体
    */
    # 例子1(在脚本文件中)
    for %%i in (a,"b c",d,123) do echo %%i
    # 例子2(在dos或者cmd窗口中)
    for %i in (a,"b c",d,123) do echo %i
    
    /*
    2.开关/L:开关/L的for语句,可以根据循环值velues里面的设置进行循环,从而实现对循环次数的直接控制
      语法格式:for /L %%v in (start,step,end) do (相关操作)
    相关解释:
      start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。
    */
    # 例子1,打印1到10(小于10)步长为2的数字
    for /l %%i in (1,2,10) do @echo %%i
    # 例子2(在dos或者cmd窗口使用)
    for /l %i in (1,2,10) do @echo %i
    
    /*
    3.开关/f:开关/f的for语句可以解析字符串和文本
      语法格式:for  /f ["options"] %%v in (循环值values) do (相关操作)
      相关解释:
        options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。
    */
    
    /*
    4.开关/D或/R:开关/D或/R的for语句是与目录或文件有关的命令,一般情况下很少使用。含开关/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    五、案例:
    1. shell:
    【1】Shell脚本: https://zhuanlan.zhihu.com/p/601971378?utm_id=0
    【2】109 个实用 shell 脚本,建议收藏!: https://zhuanlan.zhihu.com/p/468003798
    2. bat:
    【1】图标恢复.bat(解决桌面图标变为白纸的情况)
    @echo off 
    taskkill /f /im explorer.exe 
    CD /d %userprofile%\AppData\Local 
    DEL IconCache.db /a 
    start explorer.exe 
    echo 执行完成
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    【2】清理图标缓存.bat
    @echooff
    color0A
    taskkill/f/imexplorer.exe
    attrib-h-s-r”%userprofile%\AppData\Local\IconCache.db“
    del/f”%us
    echo 执行完成
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    【3】Navicat脚本
    @echo off
    echo Delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration[version and language]
    for /f %%i in ('"REG QUERY "HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium" /s | findstr /L Registration"') do (
        reg delete %%i /va /f
    )
    echo.
    echo Delete Info folder under HKEY_CURRENT_USER\Software\Classes\CLSID
    for /f %%i in ('"REG QUERY "HKEY_CURRENT_USER\Software\Classes\CLSID" /s | findstr /E Info"') do (
        reg delete %%i /va /f
    )
    echo.
    echo Finish
    pause
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    laravel Modify data is invalid 解决修改数据无效
    【源码系列#03】Vue3计算属性原理(Computed)
    梯度下降算法中的数据标准化预处理(Python实现)
    2022第五空间-web部分wp+复盘总结
    Vexip UI - 新轮子推荐,由个人开发者打造的 Vue3 UI 组件库,免费开源、开箱即用
    Python 实现自动化测试 dubbo 协议接口
    vue : 无法加载文件 C:\XXX\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。
    基于动态规划法的水力发电优化调度(Python代码实现)
    浏览器中的音视频知识总结v1.0(工作中需要和视频打交道必看!)
    算法之滑动窗口
  • 原文地址:https://blog.csdn.net/weixin_53791978/article/details/132735029