如果一个名称用%括起来,那么就是用的它的赋值,而不是本身的字母
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站设计制作、成都网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的固镇网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
比如
echo time echo %time%
以上两个前者显示time这个字母,后者显示系统时间 19:42:12:02
还有%diskdiver%=系统盘等。
可以用set自己设定,有一些是系统默认的比容上面说的time;diskdiver
----------------------------------------------------------------------
FOR这条命令基本上都被用来处理文本,我们这次除了要说他处理文本的作用外还要讲他的其他一些好用的功能!
看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)
FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令
参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释
%%变量名 :这个变量名可以是小写a-z或者大写A-Z,他们区分大小写哦~
FOR会把每个读取到的值给他!
IN:命令的格式,照写就是了!
(相关文件或命令) :FOR要把什么东西读取然后赋值给变量,不懂的话看下面的例子
do:命令的格式,照写就是了!
执行的命令:对每个变量的值要执行什么操作就写在这.
看不懂我的这些说明,可以在CMD输入for /?看系统提供的帮助!我这里也给出来吧,大家对照
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
现在开始讲每个参数的意思
/d
仅为目录
如果 Set (也就是我上面写的 "相关文件或命令") 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command。
这个参数其实我也没弄太懂...有错误希望各位纠正!
系统帮助的格式:FOR /D %%variable IN (set) DO command
他主要用于目录搜索,不会搜索文件,看这样的例子
@echo off
for /d %%i in (*) do @echo %%i
pause
把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!
在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来
@echo off
for /d %%i in (???) do @echo %%i
pause
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了
这里解释下*号和?号的作用,*号表示任意N个字符,而?号只表示任意一个字符
知道作用了,给大家个思考题目!
@echo off
for /d %%i in (window?) do @echo %%i
pause
保存到C盘下执行,会显示什么呢?自己看吧!
/D参数只能显示当前目录下的目录名字,这个大家要注意!
/R
递归
进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则认为是当前目录。如果 Set 只是一个句点 (.),则只枚举目录树。
系统帮助的格式:FOR /R [[drive:]path] %%variable IN (set) DO command
上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比/D强大多了!
他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子!
@echo off
for /r c:\ %%i in (*.exe) do @echo %%i
pause
咋们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!!
再来一个
@echo off
for /r %%i in (*.exe) do @echo %%i
pause
参数不一样了吧!这个命令前面没加那个C:\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这个BAT你把他防灾d:\test目录下执行,那么他就会把D:\test目录和他下面的子目录的全部EXE文件列出来!!!
这个参数大家因该理解了吧!还是满好玩的命令!
/L
迭代数值范围
使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。语法是:
系统帮助的格式:for /L %% Variable in (Start#,Step#,End#) do Command
看着这说明有点晕吧!咋们看例子就不晕了!
@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
保存执行看效果,他会打印从1 2 3 4 5 这样5个数字
(1,1,5)这个参数也就是表示从1开始每次加1直到5终止!
大会晕,就打印个数字有P用...好的满足大家,看这个例子
@echo off
for /l %%i in (1,1,5) do start cmd
pause
执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强!
当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了!!!名字为1-65535
看完这个被我赋予破坏性质的参数后,我们来看最后一个参数
/f
\迭代及文件解析
使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种 ParsingKeywords 选项进一步修改解析方式。使用 ParsingKeywords 令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。
文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。
系统帮助的格式:
for /F "ParsingKeywords" %% Variable in (FileNameSet) do Command
有没有发现这个参数说明比上面几个都多...没办法,人们用FOR命令主要也就是用/f参数,FOR的主场啊!大家得好好看!
先来解释下那个多出来的"ParsingKeywords"
他表示4个参数
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的分配。m-n
格式为一个范围。通过 nth 符号指定 mth。如果
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单
引号字符为文字字符串命令并允许在 filenameset
中使用双引号扩起文件名称。
先别晕了!我这就举个例子帮助大家来理解这些参数!
usebackq这个参数不用理解了,系统默认会给我们加上!
为了能使用这个例子,我们先新建一个文本文件,在里面打上这些内容保存为test.txt:
;郁闷啊!
您好! 欢迎来到, 非常批处理
我们的网站 bbs.verybat.org
完毕!
@echo off
FOR /F "eol=; tokens=1 delims= " %%i in (test.txt) do @echo %%i
pause
我们把这个BAT保存到和你的test.txt相同的目录下面然后执行
我们会看到屏幕上会显示
您好!
我们的网站
完毕!
为什么会这样?我来解释
这个命令会读取在当前目录下名为test.txt文件中的内容,将每一行的内容赋值给变量%%i,忽略掉以;号开头的行,并且以空格做为分隔符号,打印每行以空格做分隔符号的第一列
结果就是这样了!!
如果改成
当然我们想要把全部文件内容直接打印出来就可以这样
@echo off
FOR /F "delims=" %%i in (test.txt) do @echo %%i
pause
另外/F参数还可以以输出命令的结果看这个例子
@echo off
FOR /F "delims=" %%i in ('net user') do @echo %%i
pause
这样你本机全部帐号名字就出来了把扩号内的内容用两个单引号引起来就表示那个当命令执行,FOR会返回命令的每行结果,加那个"delims=" 是为了让我空格的行能整行显示出来,不加就只显示空格左边一列!
基本上讲完了FOR的基本用法了...如果你看过FOR的系统帮助,你会发现他下面还有一些特定义的变量,这些我先不讲.大家因该都累了吧!你不累我累啊....
在 Linux 系统中, $ 符号表示当前用户的命令行提示符。它通常出现在命令的开头,表示这是一条需要在命令行中运行的命令。
如果你在命令行中看到 $- 意味着这是一条终端命令,且$ 是特殊字符,表示当前用户。而- 是参数,具体取决于后面的命令。
例如: $ ls -al 这里ls是命令, -al 是参数,代表显示所有文件(包括隐藏文件)并且以详细格式显示文件信息。
01 系统特殊符号
02 系统通配符号
03 系统正则符号
说明: 查询信息的时候,会带来便利
1) 基础符号系列
$
a 调取变量信息
b 区分用户类型 $ 普通用户
c 结合awk对文件进行取列
xargs -n 2 test01.txt|awk '{print $2}'
!
a 强制的作用 wq!
b 可以实现取反
awk '!/oldgirl/' test02.txt (排除oldgirl)
find /oldboy_dir/ ! -type f (排除文件)
c !信息 可以快速调取执行历史命令(慎用)
cat ~/.bash_history -- 记录历史命令信息, 但是不会实时记录
history -- 显示所有输入过的历史命令
|
a 实现管道功能
将前一个命令执行的结果交给管道后面的命令进行处理
一般管道符号 会经常和xargs命令配合使用
批量删除操作
find /oldboy -type f -name "oldboy*.txt"|xargs rm
find /oldboy_dir/ -type f -delete
find /oldboy_dir/ -type f -exec rm -f {} \;
查找指定数据信息进行复制
find /oldboy -type f -name "oldboy*.txt" |xargs -i cp {} /oldgirl/
find /oldboy -type f -name "oldboy*.txt" |xargs cp -t /oldgirl/
find /oldboy -type f -name "oldboy*.txt" -exec cp -a {} /oldgirl \;
查找指定数据信息进行移动
find /oldboy -type f -name "oldboy*.txt" |xargs -i mv {} /oldgirl/
find /oldboy -type f -name "oldboy*.txt" |xargs mv -t /oldgirl/
find /oldboy -type f -name "oldboy*.txt" -exec mv {} /oldgirl \;
xargs(火眼金睛)后面跟的命令,不识别别名信息
#
a 表示对配置文件信息进行注释
b 表示用户的身份信息 超级管理员用户
2) 引号符号系列
"" 基本上和单引号功能类似 但是可以对一些特殊符号做出解析 $ `命令`==$(命令)
'' 里面编写的什么内容就输出什么内容 所见即所得
作用:
01. 指定需要输出的信息
02. 利用引号将空格分隔的信息汇总为一个整体
``($()) 将引号里面命令执行结果,交给引号外面命令进行使用
3) 重定向符号
/1 标准输出重定向符号
/1 标准输出追加重定向符号
2 错误输出重定向符号
2 错误输出追加重定向符号
标准输入重定向符号
tr xargs
标准输入追加重定向符号
4) 逻辑符号系列
逻辑: 在完成一件事情的时候,有合理先后顺序
前一个命令操作执行成功了,再操作执行后面的命令
|| 前一个命令操作执行失败了,再操作执行后面的命令
mkdir /old_dir echo "create dir sucess" || echo "create dir failed"
create dir sucess
mkdi /old_dir echo "create dir sucess" || echo "create dir failed"
-bash: mkdi: command not found
create dir failed
什么通配符号: 用于匹配文件名称信息, 便于快速查找文件信息 find
* 匹配所有信息
find /oldboy -type f -name "oldboy*" ---以oldboy开头的信息都查询出来
find /oldboy -type f -name "*oldboy" ---以oldboy开头的信息都查询出来
find /oldboy -type f -name "oldgirl*oldboy"
---以oldgirl 开头的信息
以oldboy 结尾的信息都查询出来
{} 产生序列信息
连续序列:
echo {01..05}
echo {a..z}
echo {A..Z}
生成不连续序列
a 有规律的不连续序列
echo {01..05..2}
01 03 05
echo {a..z..2}
b 没规律的不连续序列
echo {www,bbs,blog}
www bbs blog
生成组合序列
echo {1,2}{a,b}
1a 1b 2a 2b
echo {1,2}{a,b}{A,B}
1aA 1aB 1bA 1bB 2aA 2aB 2bA 2bB
echo A{a,b}
Aa Ab
A=oldboy.txt
echo oldboy.txt{a,b}
oldboy.txta oldboy.txtb
echo A{,b}
A Ab
A=oldboy.txt
b=.bak
cp oldboy.txt{,.bak} == cp oldboy.txt oldboy.txt.bak
快速备份文件命令
cp oldboy.txt{,.bak}
快速还原数据方法
cp oldboy.txt{.bak,}
echo A{B,}
AB A
oldboy.txt{.bak,} == cp oldboy.txt.bak oldboy.txt
基础正则符号:basic regular expression (BRE)
扩展正则符号:extended regular expression (ERE)
基础正则符号:
a 尖角符号:^
以什么开头的信息进行过滤出来
grep -v "^#" nginx.conf.default nginx.conf(对不需要关注的信息取反)
常见错误
find / -type f -name "^oldboy" 错误
find / -type f -name "oldboy*" 正确
b 美元符号:$
以什么结尾的信息进行过滤出来
以m结尾信息, 并且显示上1行 和 下2行的信息
grep "m$" -A 2 -B 1 test.txt
常见错误:
如果过滤不出来,确认每行结尾是否有空格信息
方法一:
cat -A test.txt
方法二
vim 底行模式输入命令 --- :set list
c 尖角美元符号:^$
取出文件中空行信息
grep "^$" test.txt
grep -v "^$" test.txt
d 点符号: .
表示匹配任意一个且只有一个字符
grep "." test.txt -o(更直观的显示过程)
e 星号符号: *
匹配星号前面一个字符连续出现0次或多次
f 点和星号组合: .*
匹配所有信息
说明: 正则符号在匹配数据信息的时候具有贪婪特性
避免贪婪特性的方法,是在指定一行信息中唯一节点信息
g 转译符号: \
1) 将一些有意义的符号进行转译, 变为一个普通符号
grep "\.$" ~/oldboy_test.txt
2) 将一些没有意义的符号进行转译,变为有意义符号
\n 换行符号 linux
3) 可以将扩展正则符号转换成普通正则让grep sed命令可以直接识别'
grep "o\?" test.txt
h 括号符号:[]
匹配括号中每一个字符,并且匹配的关系是或者的关系
需求: 找出文件中oldboy 和 oldbey两个单词信息
grep "oldb[oe]y" test.txt
企业应用: 找寻文件中字母 数字信息
grep "[0-9a-zA-Z]" test.txt
i 尖号和中括号组合使用 : [^]
对中括号里面匹配的字符信息进行排除
grep "[^0-9a-zA-Z]" test.txt --- 将字母数字都排除,只留下符号信息
尖号和中括号组合使用 : ^[]
以中括号里面匹配的字符作为一行开头的字符
grep "^[zx]" test.txt
正则符号注意事项
按照每行信息进行过滤处理
注意正则表达符号禁止中文
附上颜色信息进行正则过滤 --color=auto/--color
基础正则符号可以被三剑客命令直接识别 grep sed awk
扩展正则符号不可以被三剑客命令中老二和老三直接识别
sed命令想识别正则符号: sed -r
grep命令想识别正则符号: egrep / grep -E
a 加号符号:+
匹配加号前面一个字符连续出现1次或者多次
b 竖线符号:|
或者关系符号
egrep "oldboy|oldbey" test.txt
c 括号符号:()
将多个字符信息进行汇总为一个整体
egrep "(oldboy)" test.txt
进行后向引用前向的一个操作(sed)
echo "123456"|sed -r "s#(..)(..)(..)#\1\2\3#g"
修改配置文件内容
sed -rn "s#(^S.*UX=).*#\1enforcing#gp" /etc/selinux/config
SELINUX=enforcing
d 括号符号:{}
指定花扩号前一个字符连续匹配多少次
* 连续匹配 0 次 或 多次
+ 连续匹配 1 次 或 多次
1) {n,m} n表示最少连续匹配多少次 m表示最多连续匹配多少次
2) {n} n表示只连续匹配n次
3) {n,} n表示至少连续匹配n次,至多没有限制
4) {,m} m表示至多连续匹配n次,至少0次
e 问号符号:?
表示匹配问号前面一个字符出现0次或者1次