Shell是在Linux内核的基础上编写的一个应用程序,它连接了用户和Linux内核,从而让用户能够更加便捷、高效、安全的使用Linux内核。
Shell脚本就是由Shell命令组成的可执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。
一个简单的Shell脚本示例如下:
x1
2echo hello
3
可以使用./hello.sh(需要x权限)
、. hello.sh
、source hello.sh
或sh hello.sh
命令执行。
Shell 提供了一些用于调试脚本的选项,如:
选项 | 作用 |
---|---|
-n | 读一遍脚本中的命令但不执行,用于检查脚本中的语法错误。 |
-v | 一边执行脚本,一边将执行过的脚本命令打印到标准错误输出。 |
-x | 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。 |
这些选项有三种常见的使用方法:
171# 1. 在命令行提供参数
2sh -x ./script.sh
3
4# 2. 在脚本开头提供参数
5
6
7# 3. 在脚本中用 set 命令启用或禁用参数,这样可以只对脚本中的某一段进行跟踪调试
8
9if [ -z "$1" ]; then
10 # 启用-x参数
11 set -x
12 echo "ERROR: Insufficient Args."
13 exit 1
14 # 禁用-x参数
15 set +x
16fi
17
Shell中有三种类型的变量:
211# 定义变量
2# 注意:变量名必须以字母开头,中间没有空格(可以使用下划线),且不能为bash的保留关键字!
3name="hyx"
4
5# 使用变量
6echo $name
7echo ${name}
8echo ${var:-word} # 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变var 的值
9echo ${var:=word} # 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
10echo ${var:?message} # 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在 Shell 脚本中,那么脚本将停止运行。
11echo ${var:+word} # 如果变量 var 被定义,那么返回 word,但不改变 var 的值。
12
13# 变量只读
14readonly name
15
16# 删除变量(注意:不能删除只读变量)
17unset name
18
19# Local变量(只能在函数中定义和访问)
20local name="hyx"
21
变量 | 含义 |
---|---|
$0 | 代表执行的文件名 |
$n | 代表传入的第n个参数,如$1 |
$# | 参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$$ | 脚本运行的当前进程号 |
$! | 后台运行的最后一个进程的ID |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
151
2# $*演示,结果为:
3# 1 2 3
4for i in "$*"; do
5 echo $i
6done
7
8# $@演示,结果为:
9# 1
10# 2
11# 3
12for i in "$@"; do
13 echo $i
14done
15
使用参数时一般需判断参数是否存在(注意$1需要加双引号)。
51if [ -n "$1" ]; then
2 echo "包含第一个参数"
3else
4 echo "没有包含第一参数"
5fi
351# 不支持转义的字符串变量(特殊的,可以跨行,即文本块)
2str01='test'
3echo 'abc
4> cde'
5
6# 支持转义的字符串变量(会解析${}变量和转义字符)
7str02="str01 is ${str01}"
8
9# 转义字符
10echo \$SHELL # $SHELL
11echo \\ # \
12touch \$\ \$ # 创建一个文件名为“$ $”的文件($间含有空格)
13touch ./-hello # 创建一个文件名以-号开头的文件
14touch -- -hello # 创建一个文件名以-号开头的文件
15ls \ # 续行
16> -l
17
18# 字符串拼接
19str03="1"'2'"3"
20str03=${str01}${str02}
21str03="${str01} ${str02}"
22str03=`date`"." # date命令需要使用``来引用
23
24# 获取字符串长度
25echo ${#str02}
26
27# 字符串截取
28var=aabbccddaabbccdd.jpg
29echo ${var#*bb} # 截取第一个bb后的字符串
30echo ${var##*bb} # 截取最后一个bb后的字符串
31echo ${var:0:3} # 截取第0-3位
32
33# 查找子串
34str="runoob is a great site"
35echo `expr index "$str" is` # 输出 8
241# 定义数组
2arr=(1 2 3 4 5 6)
3arr2=("abc" "def")
4
5# 数组元素赋值
6arr[0]=666
7arr=(1=999 2=9999)
8
9# 读取数组元素
10echo ${arr[0]}
11
12# 读取数组全部元素
13echo ${arr[*]}
14echo ${arr[@]}
15
16# 数组长度
17echo ${#arr[*]}
18
19# 合并数组
20echo "${arr[*]} ${arr2[*]}"
21
22# 删除数组元素
23unset arr[2]
24
原生的bash并不支持简单的数学运算,通常要通过其它命令来实现。
运算 | 格式 |
---|---|
加法 | expr $a + $b |
减法 | expr $a - $b |
乘法 | expr $a \* $b |
除法 | expr $b / $a |
取余 | expr $b % $a |
赋值 | a=$b |
相等 | [ $a == $b ] |
不相等 | [ $a != $b ] |
271a=10
2b=20
3
4val=`expr $a + $b`
5echo "a + b : $val"
6
7val=`expr $a - $b`
8echo "a - b : $val"
9
10val=`expr $a \* $b`
11echo "a * b : $val"
12
13val=`expr $b / $a`
14echo "b / a : $val"
15
16val=`expr $b % $a`
17echo "b % a : $val"
18
19if [ $a == $b ]
20then
21 echo "a 等于 b"
22fi
23if [ $a != $b ]
24then
25 echo "a 不等于 b"
26fi
27
下面是其它一些可用的运算指令:
121# $[]
2echo $[$a+$b]
3
4# $(())
5$((var=$a+$b))
6
7# let
8let var=$a+$b
9
10# bc(小数运算)
11var=$(echo "(1.1+2.1)"|bc)
12
注意:
- 左括号
[
也是一个命令,位于/usr/bin/[,在书写命令参数时注意使用空格分开。
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
运算 | 格式 |
---|---|
检测两个数是否相等 | [ $a -eq $b ] |
检测两个数是否不相等 | [ $a -ne $b ] |
检测左边的数是否大于右边的 | [ $a -gt $b ] |
检测左边的数是否小于右边的 | [ $a -lt $b ] |
检测左边的数是否大于等于右边的 | [ $a -ge $b ] |
检测左边的数是否小于等于右边的 | [ $a -le $b ] |
391a=10
2b=20
3
4if [ $a -eq $b ]
5then
6 echo "$a -eq $b : a 等于 b"
7else
8 echo "$a -eq $b: a 不等于 b"
9fi
10if [ $a -ne $b ]
11then
12 echo "$a -ne $b: a 不等于 b"
13else
14 echo "$a -ne $b : a 等于 b"
15fi
16if [ $a -gt $b ]
17then
18 echo "$a -gt $b: a 大于 b"
19else
20 echo "$a -gt $b: a 不大于 b"
21fi
22if [ $a -lt $b ]
23then
24 echo "$a -lt $b: a 小于 b"
25else
26 echo "$a -lt $b: a 不小于 b"
27fi
28if [ $a -ge $b ]
29then
30 echo "$a -ge $b: a 大于或等于 b"
31else
32 echo "$a -ge $b: a 小于 b"
33fi
34if [ $a -le $b ]
35then
36 echo "$a -le $b: a 小于或等于 b"
37else
38 echo "$a -le $b: a 大于 b"
39fi
运算 | 格式 |
---|---|
非运算 | [ ! false ] |
或运算 | [ $a -lt 20 -o $b -gt 100 ] |
与运算 | [ $a -lt 20 -a $b -gt 100 ] |
271a=10
2b=20
3
4if [ $a != $b ]
5then
6 echo "$a != $b : a 不等于 b"
7else
8 echo "$a == $b: a 等于 b"
9fi
10if [ $a -lt 100 -a $b -gt 15 ]
11then
12 echo "$a 小于 100 且 $b 大于 15 : 返回 true"
13else
14 echo "$a 小于 100 且 $b 大于 15 : 返回 false"
15fi
16if [ $a -lt 100 -o $b -gt 100 ]
17then
18 echo "$a 小于 100 或 $b 大于 100 : 返回 true"
19else
20 echo "$a 小于 100 或 $b 大于 100 : 返回 false"
21fi
22if [ $a -lt 5 -o $b -gt 100 ]
23then
24 echo "$a 小于 5 或 $b 大于 100 : 返回 true"
25else
26 echo "$a 小于 5 或 $b 大于 100 : 返回 false"
27fi
运算 | 格式 |
---|---|
逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] |
逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] |
161a=10
2b=20
3
4if [[ $a -lt 100 && $b -gt 100 ]]
5then
6 echo "返回 true"
7else
8 echo "返回 false"
9fi
10
11if [[ $a -lt 100 || $b -gt 100 ]]
12then
13 echo "返回 true"
14else
15 echo "返回 false"
16fi
注意:逻辑运算具有特殊的短路功能!
运算 | 格式 |
---|---|
检测两个字符串是否相等 | [ $a = $b ] |
检测两个字符串是否不相等 | [ $a != $b ] |
检测字符串长度是否为0 | [ -z $a ] |
检测字符串长度是否不为 0 | [ -n $a" ] |
检测字符串是否为空 | [ $a ] |
451a="abc"
2b="efg"
3
4if [ $a = $b ]
5then
6 echo "$a = $b : a 等于 b"
7else
8 echo "$a = $b: a 不等于 b"
9fi
10
11if [ $a != $b ]
12then
13 echo "$a != $b : a 不等于 b"
14else
15 echo "$a != $b: a 等于 b"
16fi
17
18if [ -z $a ]
19then
20 echo "-z $a : 字符串长度为 0"
21else
22 echo "-z $a : 字符串长度不为 0"
23fi
24
25if [ -n "$a" ]
26then
27 echo "-n $a : 字符串长度不为 0"
28else
29 echo "-n $a : 字符串长度为 0"
30fi
31
32if [ $a ]
33then
34 echo "$a : 字符串不为空"
35else
36 echo "$a : 字符串为空"
37fi
38
39a=""
40if [ -n "$a" ]
41then
42 echo "-n $a : 字符串长度不为 0"
43else
44 echo "-n $a : 字符串长度为 0"
45fi
运算 | shell中的实现 |
---|---|
检测文件是否是块设备文件 | [ -b $file ] |
检测文件是否是字符设备文件 | [ -c $file ] |
检测文件是否是目录 | [ -d $file ] |
检测文件是否是普通文件(既不是目录,也不是设备文件) | [ -f $file ] |
检测文件是否设置了 SGID 位 | [ -g $file ] |
检测文件是否设置了粘着位(Sticky Bit) | [ -k $file ] |
检测文件是否是有名管道 | [ -p $file ] |
检测文件是否设置了 SUID 位 | [ -u $file ] |
检测文件是否可读 | [ -r $file ] |
检测文件是否可写 | [ -w $file ] |
检测文件是否可执行 | [ -x $file ] |
检测文件是否为空(文件大小是否大于0) | [ -s $file ] |
检测文件(包括目录)是否存在 | [ -e $file ] |
441file="/var/www/runoob/test.sh"
2if [ -r $file ]
3then
4 echo "文件可读"
5else
6 echo "文件不可读"
7fi
8if [ -w $file ]
9then
10 echo "文件可写"
11else
12 echo "文件不可写"
13fi
14if [ -x $file ]
15then
16 echo "文件可执行"
17else
18 echo "文件不可执行"
19fi
20if [ -f $file ]
21then
22 echo "文件为普通文件"
23else
24 echo "文件为特殊文件"
25fi
26if [ -d $file ]
27then
28 echo "文件是个目录"
29else
30 echo "文件不是个目录"
31fi
32if [ -s $file ]
33then
34 echo "文件不为空"
35else
36 echo "文件为空"
37fi
38if [ -e $file ]
39then
40 echo "文件存在"
41else
42 echo "文件不存在"
43fi
44
扩展:文件名通配符
*
:匹配 0 个或多个任意字符,如:ls /dev/ttyS*。?
:匹配一个任意字符,如:ls ch0?.doc。[若干字符]
:匹配方括号中任意一个字符的一次出现,如:ch[012] [0-9].doc。
61# `命令`
2echo `date`
3
4# $(命令)
5echo $(date)
6
101
2
3a="check"
4
5if [ $a == "check" ]
6then
7 echo "check..."
8fi
9
10
121
2
3a=10
4
5if [ $a -eq 10 ]
6then
7 echo "相等"
8else
9 echo "不相等"
10fi
11
12
151
2
3file="./t1.sh"
4
5if [ -b $file ]
6then
7 echo "块设备"
8elif [-c $file ]
9then
10 echo "字符设备"
11else
12 echo "其它文件"
13fi
14
15
331
2
3# 遍历多个值
4for item in 1 2 3 4 5
5do
6 echo "This value is $item"
7done
8
9# 显示主目录下以 .bash 开头的文件
10for FILE in $HOME/.bash*
11do
12 echo $FILE
13done
14
15# 从文件中读取每行信息,并输出s
16for Name in $(cat ./namefile)
17do
18 echo $Name
19done
20
21# 遍历数组
22arr=("a" "b" "c" "d")
23for item in ${arr[*]}
24do
25 echo $item
26done
27
28# 遍历数组
29for((i=0; i<${#arr[*]}; i++))
30do
31 echo "arr[$i] = ${arr[$i]}"
32done
33
81
2var=0
3while(($var<5))
4do
5 echo $var
6 let var=var+1
7done
8
121for (( ; ; ))
2
3while :
4do
5 command
6done
7
8while true
9do
10 command
11done
12
until 循环执行一系列命令直至条件为 true 时停止。
61until condition
2do
3 command
4done
5
6
301
2
3var=0
4
5while(($var < 5))
6do
7 if [ $var == 3 ]
8 then
9 break
10 fi
11
12 echo $var
13 let var=$var+1
14done
15
16
17
18var=0
19
20while(($var < 5))
21do
22 let var=$var+1
23 if [ $var == 3 ]
24 then
25 continue
26 fi
27
28 echo $var
29done
30
321var=$1
2var=${1:-stop}
3echo "\$1 is $var"
4
5case $var in
6start)
7 echo "start..."
8 ;;
9stop)
10 echo "stop..."
11 ;;
12*)
13 echo "不支持的命令"
14 ;;
15esac
16
17var2=${2:-10}
18echo "\$2 is $var2"
19
20case $var2 in
2110)
22 echo "this is first item."
23 ;;
2420)
25 echo "this is second item."
26 ;;
27*)
28 echo "other."
29 ;;
30esac
31
32
131
2
3echo "Please select..."
4
5select var in "Linux" "Windwos" "Other"
6do
7 break;
8done
9
10echo "you have selected $var"
11
12
13
181
2
3# 函数定义时无需声明参数、无需声明返回值,function关键字也可以省略
4function func01(){
5 # 定义局部变量
6 local var=10
7
8 # 函数参数
9 echo "参数1:$1"
10 echo "参数2:$2"
11
12 # 也可以使用echo进行返回
13 echo "ret is $var"
14}
15
16result=$(func01 1 2)
17echo $result
18
注意:
- 当函数没有return时,默认返回最后一个命令的运行结果作为返回值。
$10
不能返回第十个参数,当n>10的时候,需要使用$(n)
来获取参数。- 函数内部的定义的变量在外部也可以访问,可以使用
local
关键字限制。
一般情况下,每个Linux命令运行时都会打开三个文件:
但有些时候我们可能需要将数据从其它文件读入或读出,这就需要我们重定向。
151# 输入流重定向到文件
2command < file
3
4# 输出流重定向到文件
5command > file
6
7# 错误流重定向到文件
8command 2>file
9
10# 输出和错误流重定向到文件
11command > file 2>&1
12
13# 重定向到null文件(即输出被丢弃)
14command > /dev/null
15
91# 显式字符串
2echo "It is a test"
3
4# 换行
5echo -e "OK! \n" # -e 开启转义
6
7# 不换行
8echo -e "OK! \c" # -e 开启转义 \c 不换行
9
read 命令用于获取键盘输入信息。
31read -p "input a val:" a #获取键盘输入的 a 变量数字
2read -p "input b val:" b #获取键盘输入的 b 变量数字
3r=$[a+b] #计算a+b的结果 赋值给r 不能有空格
可以通过 |
把一个命令的输出传递给另一个命令做输入。
31cat myfile | more
2ls -l | grep "myfile"
3df -k | awk '{print $1}' | grep -v "文件系统"
批处理是使用批处理文件(Batch File,简称BAT文件)进行批量的命令处理的过程。批处理文件从内容上来看包含了大量的基本DOS命令,是一种可执行文件。批处理文件运行时会按照规则从逐一执行文件中的命令,本质上是一些命令的集合。
命令 | 说明 |
---|---|
dir | 展示路径下的目录和文件信息 |
cd | 切换路径。可以用cd .. 来切换到上层路径。 |
盘符: | 切换盘符。如d: 。 |
md | 创建文件夹 |
rd | 删除文件夹 |
copy | 复制文件到指定路径 |
move | 移动文件到指定路径 |
ren | 文件重命名 |
del | 删除文件 |
type | 查看文件 |
edit | 编译文件 |
命令 | 说明 |
---|---|
title | 修改cmd窗口标题 |
prompt | 修改命令提示符 |
echo | 回显。可以使用echo on/off来打开/关闭命令回显。也可以使用@echo作用于单条命令。 |
命令 | 说明 |
---|---|
set [变量名] | 查看变量的值。可以省略变量名来查看所有变量。 |
set [变量名]=[变量值] | 定义一个字符串类型的变量,并给它赋值。如set var1=abc 。注意,=两边最好不要有空格。 |
set /a [变量名]=[变量值] | 定义一个数值型变量,并给它赋值。 |
set /p [变量名]=[提示信息] | 从标准输入设备获取值,并给予用户提示信息。 |
命令 | 说明 |
---|---|
%变量名% | 获取操作系统变量值 |
%变量名:源串=目的串% | 读取变量的值做替换后返回,且原变量的值不变。 |
%变量名:~m,n% | 读取变量的值截取某一片段返回,且原变量的值不变。 |
有var=1234567890,有如下:
91%var% 1234567890 显示所有
2%var:23=bc% 1bc4567890 替换23为bc
3%var:~4% 567890 从第4个字符以后开始显示
4%var:~4,3% 567 从第4个字符以后开始显示,并只显示前3个
5%var:~-4% 7890 从倒数第4个字符开始显示
6%var:~-4,3% 789 从倒数第4个字符开始显示,并只显示前3个
7%var:~4,-2% 5678 从第4个字符以后开始显示,显示到还剩2个为止
8%var:~0,3% 123 从头开始显示,并只显示前3个字符
9%var:~0,-3% 1234567 从头开始显示,显示到还剩3个字符为止
命令 | 说明 |
---|---|
命令1 & 命令2 | 命令1执行完后按顺序执行命令2。 |
命令1 && 命令2 | 命令1执行完后,如果结果正确,才执行命令2。 |
命令1 |
案例:
31dir "D:\test" & echo Seems it does not exist。
2dir "D:\test" && echo Seems it does not exist。
3dir "D:\test" || echo Seems it does not exist.
命令 | 说明 |
---|
>
|将命令的输出进行重定向,并覆盖原有内容
>>
|将命令的输出进行重定向,但不覆盖原有内容
|
|将命令1的输出作为命令2的输入
管道命令还有 < 、<& 和 >& ,它们并不常见,在此暂时不讨论了。
命令 | 说明 |
---|---|
call [标签] | 用于调用另一个批处理文件,调用完成后继续返回执行。 |
start [标签] | 也用于调用另一个批处理文件,特点是会为其新开一个线程,从而不影响原线程执行。 |
标签的定义以
:
开头。批处理文件也有一些固定的标签。如:EOF
命令 | 说明 |
---|---|
help [命令] | 查看命令的帮助信息。命令 /? 也可以达到相同效果 |
rem | 注释该行命令 |
cls | 清空屏幕显示 |
color | 改变命令窗口颜色 |
在命令行执行批处理文件时,可以传递一些参数。如:
11test01.bat arg1 arg2
那么在批处理中可以通过%参数位置
的方式来获取传入的参数。如:%1
、%2
等,值得注意的是,批处理文件最多只能传递9个参数。
test01的文件可以是如下所示:
51set arg1=%1
2set arg2=%2
3
4echo %arg1%
5echo %arg2%
通常的,批处理文件在头部定义一些变量,来接受外部传入的参数
输出参数一般不常用,但还是可以了解下它们。请看如下bat文件(num_add.bat):
41set /a arg1=%1
2set /a arg2=%2
3
4set /a %3=arg1+arg2
可以进行一个简单的加法操作,下面是一组用于测试的命令:
31set /a num_val=0
2num_add.bat 1 2 num_val
3echo %num_val%
有下面一个批处理文件:
131@echo 开始测试...
2call :lable1 abc
3
4:lable2
5echo 然后显示这句
6pause
7
8goto :EOF
9
10:lable1
11echo 首先显示这句,后面跟的参数为 %1
12pause
13
goto命令是不可以携带参数的
if-else的基本语法格式如下:
91if 条件表达式
2(
3 语句;
4)
5else
6(
7 语句;
8)
9
再附加上一个案例,相信你一看就能明白:
71if "%TIME:~0,2%" lss "12"
2(
3 echo 现在是上午
4) else
5(
6 echo 现在是下午
7)
变量 TIME 是动态环境变量之一,表示当前时间。 lss 是if命令扩展用法,表示小于的意思。更多信息可以在
if/?
中获得。
这里有一个小提示,为了防止出现某些意料之外的错误,请勿在if语句进行比较处加一些不必要的空格。
这是一个很有意思的特性。下面的例子可以很好的说明直接变量扩充与延迟变量扩充的区别。
151@echo off
2setlocal EnableDelayedExpansion
3
4set /a num=5
5
6if %num% == 5 (
7 set /a num*=3
8
9 echo 在 if 语句之前,变量 num 等于 %num%
10 echo 但变量 num 在经过运算后,且由于延迟变量扩充被启用,变量 num 等于 !num!
11)
12
13echo 但最终变量 num 还是等于 %num%
14
15pause
setlocal EnableDelayedExpansion 表示开启延迟变量扩充,此时的 !num! 才有意义。
if 还有其他的用法。其中if exist
用于判断文件是否存在,就像下面这样:
51if exist "D:\test my folder\a.txt" (
2del "D:\test my folder\a.txt"
3) else (
4echo 您所要删除的文件不存在
5)
在对文件进行操作之前进行判断其是否存在很有意义,这使得代码更加健壮。
而if defined
也与之类似,只不过判断对象不是文件,而是变量,它用于判断环境变量是否被定义。
for-in大致有三种常用的用法,分别是作用于文件、数字、以及字符串。
下面是一个批量修改文件名的批处理文件。
121@echo off
2setlocal EnableDelayedExpansion
3
4set /p zpath=请输入目标文件所在的路径:
5set /p prefix=请输入文件名前缀(不能包含以下字符\/:*?"<>|):
6set /p ext=请输入文件的扩展名(例如 .txt):
7set /a num=1
8
9for %%i in (%zpath%\*%ext%) do (
10 ren "%%i" "%prefix%!num!.%ext%"
11 set /a num+=1
12)
%%i表示迭代变量。值得注意的是,在批处理文件中(而不是命令行),必须使用双%来标识。
如果想对一系列有规律的数字进行循环,或是在一定的次数内对某个操作进行循环重复的执行,使用 for 也能够实现。下面是一个很好的例子:
141@echo off
2setlocal EnableDelayedExpansion
3
4set var=¥
5for /l %%i in (1,1,7) do set var=%var%!var!
6rem 此时变量 var 已经变成一行连续的8个¥了
7
8for /l %%i in (1,1,8) do (
9 echo 这是第 %%i 份>输出结果%%i.txt
10 for /l %%j in (1,1,8) do echo %var%>>输出结果%%i.txt
11)
12
13echo 8 X 8 的 ¥ 矩阵已经画好,并保存到8份文本文件里了
14pause
/l 是可以跟在 for 后面的重要参数之一。用于标识作用于数字的for-in循环。in中的三个值分为为起始值、步长和结束值。
for 也可以对指定范围内的文字进行循。for 后面跟参数 /f ,/f 后面跟选项,所指定的范围 in 里可以是一个文件里的文字,可以是一个字符串,也可以是一条命令的输出结果。我们首先以一个文件里的文字作为循环对象,循环时,每一行将被循环一次。
291@echo off
2echo 测试 文字筛选.txt 里每一行的首单词
3for /f %%i in (文字筛选.txt) do echo %%i
4pause
5
6echo.
7echo skip=2 表示前两行被跳过
8for /f "skip=2" %%i in (文字筛选.txt) do echo %%i
9pause
10
11echo.
12echo tokens=2,4-6 表示提取每行的第2个、以及第4到6个单词
13for /f "skip=2 tokens=2,4-6" %%i in (文字筛选.txt) do echo %%i, %%j, %%k, %%l.
14pause
15
16echo.
17echo eol=N 表示当此行的首字母为 N 时,就忽略该行
18for /f "eol=N skip=2 tokens=2,4-6" %%i in (文字筛选.txt) do echo %%i, %%j, %%k, %%l.
19pause
20
21echo.
22echo delims=e 表示不再以空格区分每个词,而是以字母 e 作为间隔
23for /f "eol=N skip=2 tokens=2,4-6 delims=e" %%i in (文字筛选.txt) do echo %%i, %%j, %%k, %%l.
24pause
25
26echo.
27echo usebackq 表示双引号里的东西是文件名而不是字符串
28for /f "usebackq eol=N skip=2 tokens=2,4-6 delims=e" %%i in ("文字筛选.txt") do echo %%i, %%j, %%k, %%l.
29pause
作为测试,可以在上述批处理文件的同一路径下创建一个用于测试的文本文件 文字筛选.txt ,其内容为:
51Hello there!
2This text is an example of test for the batch file 文字筛选.bat.
3Notice the first letter in this line, N.
4If the eol charactor was set to be letter N.
5The third line will not be considered by the batch.
goto和call可以无条件的改变命令的执行顺序。下面是一个使用goto的案例
121@echo off
2goto :FirstLable
3
4:SecondLable
5echo 然后显示这句
6pause
7goto :EOF
8
9:FirstLable
10echo 首先显示这句
11pause
12goto :SecondLable
call与goto的使用方式类似,但call执行完后依然会回到call之前的位置继续执行剩下的代码,案例可以参考上章节。