中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-07-01 21:37
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请教 shift 命令的详细解释 查看 1,105 回复 7
楼 主 请教 shift 命令的详细解释 发表于 2007-06-27 16:23 ·  中国 香港 第一线有限公司
新手上路
积分 12
发帖 5
注册 2007-06-25 15:06
19年会员
UID 92307
性别 男
状态 离线
批处理文件下比较难看懂的就数参数问题了,而再加上shift这么一掺乎更加有点难懂了饿。所以请高手指点指点。
最好可以通过一个比较经典的例子来讲解一下阿。因为关于帮助里面关于shift的介绍似乎太理论化了,比较难懂。

等待各位高手指点,谢谢:P

[ Last edited by bjsh on 2007-7-31 at 10:47 AM ]
挺起不屈的脊樑 - 意志 信心 勇氣
2 发表于 2007-06-27 16:36 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
自己在命令行下试一下test.bat 1 2 3 4 5 6 7 8 9 0

test.bat
@echo off

:loop
cls
echo %1
echo.
pause
shift
goto :loop
3 发表于 2007-06-27 16:53 ·  中国 香港 第一线有限公司
新手上路
积分 12
发帖 5
注册 2007-06-25 15:06
19年会员
UID 92307
性别 男
状态 离线
我了解你的意思,也就是说当切换到shift命令时,
参数赋予了%0 (也就是bat本身)继续运行。这
个循环玩得比较经典 :lol:

再搞个比较复杂点的来see see ... :D
谢谢
挺起不屈的脊樑 - 意志 信心 勇氣
4 发表于 2007-06-27 19:35 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
shift就是这样用的,没什么比较复杂的,用到才想的出来,没用到想破脑袋也see see ...不了

参数不是赋予了%0,而是从后面往前面往前面移位或者设定从第 n 个参数开始移位
5 发表于 2007-06-28 10:04 ·  中国 香港 第一线有限公司
新手上路
积分 12
发帖 5
注册 2007-06-25 15:06
19年会员
UID 92307
性别 男
状态 离线
你也在忧郁蓝色手机论坛混得啊~~
哈哈,世界是小的~~
挺起不屈的脊樑 - 意志 信心 勇氣
6 发表于 2007-10-17 14:16 ·  中国 浙江 台州 电信
初级用户
积分 55
发帖 29
注册 2006-04-11 16:40
20年会员
UID 53669
性别 男
来自 亚洲
状态 离线
N X ~ 经典~!!
7 借题发挥一下 发表于 2007-10-17 15:41 ·  中国 浙江 台州 电信
初级用户
积分 55
发帖 29
注册 2006-04-11 16:40
20年会员
UID 53669
性别 男
来自 亚洲
状态 离线
@echo off
set Num=1 2 3 4 5 6 7 8 9
echo @echo off >>u.bat
echo set Num=%%1 >>u.bat
echo :loop >>u.bat
echo echo %%1 >>u.bat
echo echo. >>u.bat
echo pause >>u.bat
echo shift >>u.bat
echo goto loop >>u.bat
call u.bat %Num%
pause

只能 通过CALL 来完成,麻烦哪位 牛 插 的 ……出来亮亮相哦!!
不用call直接完成这个循环~!
8 发表于 2008-02-08 22:36 ·  中国 吉林 吉林市 联通
中级用户
★★
积分 307
发帖 130
注册 2008-02-01 21:29
18年会员
UID 109981
性别 男
状态 离线
一些初学者朋友对于shift命令感到非常的困惑,抱怨网上的一些shift命令教程很难理解。为了解决这个问题,于是我就写了一下这个
“超生游击队”教程以供初学者朋友参考。

言归正传,比如我老爸有10个儿子,我英雄是第10个。

第一步:
我们现在用一个另类的办法输出10个儿子的名字,将如下代码保存为hero.bat。
@echo off
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
echo %7
echo %8
echo %9
echo %10
pause
如何运行呢?我们可以另写一个bat,内容是:call hero.bat 老大 老二 老三 …… 英雄
也就是调用hero.bat并共带10个参数!
能正确运行吗?不能,很遗憾,因为根本没有%10。


第二步:
在上一步中没有输出我英雄的大名,那难道我英雄就不是我老爸的儿子吗!我得想个办法把我的名字也输出来。
好了,借助shift命令就可以达到。我们把hero.bat中的代码改一下。
@echo off
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
echo %7
echo %8
echo %9
shift
echo %9
pause
终于我的大名输出了。可是英雄明明是第10个参数呀,怎么现在变成第9个了?
这个就是shift的功能.

也就是,执行shift命令以后,原来的%9变成了%8,原来的%8变成了%7,原来的%7变成了%6……而原来的%1变成了%0,此时原来的%0没了。
也就是说后面的参数依次冲掉了前面的参数,而为了输出我的名字,最终牺牲了%0。


第三步:
我老爸又认了4个干儿子,名字分别为a,b,c,d
到此,我老爸有多了4个干儿子。共14个儿子。

在调用hero.bat时又多了4个参数,则运行hero.bat时有:call hero.bat 老大 老二 老三 …… 英雄 a b c d
(注意:要把省略号换成名字。)


此时,hero.bat的代码如下:(最容易理解的方法)

@echo off
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
echo %7
echo %8
echo %9
shift
echo %9
::现在的%9是英雄

shift
echo %9
::现在的%9是a

shift
echo %9
::现在的%9是b

shift
echo %9
::现在的%9是c

shift
echo %9
::现在的%9是d

pause
论坛跳转: