echo "enter first number:"
read first_num
变为 set /p first_num="输入第一个数字"
while [ first_num && second_num != 999 ]
没有 WHILE - 必须接线。想想俱乐部和岩石。
:loop
if %first_num%==999 goto endloop
if %second_num%==999 goto endloop
...
goto loop
:endloop
:name
是一个标签,%var%
检索的内容var
- 如果字符串包含空格,则始终是用引号括起来的字符串。
if [ second_num != 0 ]; then
翻译是
if NOT %second_num%==0 ( ...things... ) else (...other things...)
或者,当然
if %second_num%==0 ( ...other things... ) else (...things...)
怪癖:(其中之一):第一个左括号必须与 the 出现在同一物理行上,IF
并且 theELSE
必须与)
on-true statemet 序列的 the 在同一物理行上。
echo first_num "/" second_num "=" $((first_num / second_ num)) >> file.txt
无法在回声中进行计算
set /a result=(first_num / second_ num)
或者
set /a result=(%first_num% / %second_ num%)
SET /A
应用算术表达式的结果 - 稍后的加法和更多类似 C 的语义
然后
echo %first_num% / %second_num% = %result% >> file.txt
纯粹将元素串在一起。
接下来有一个小问题。在解析过程中,任何 %var% 都会被其 PARSE-TIME 值替换,然后执行该行。因此,ECHO
上面的行将显示输入 IF 语句时的值,而不是计算后的值。
两种治疗方法:
您可以使用SETLOCAL ENABLEDELATEDEXPANSION
来切换解释器模式。在 DELAYEDEXPANSION 模式下,!var!
可用于检索 的 RUN-TIME 值var
。在同一上下文中,ASETLOCAL
由 a 或到达 END-OF-FILE 终止。ENDLOCAL
a 之后的任何环境更改SETLOCAL
都被 an 撤消,ENDLOCAL
这就是为什么它通常在@echo off
- 保持环境清洁之后立即执行。
第二种治疗方法是使用子程序。CALL :SUB
(冒号的意思是“内部子程序 - 开始标签在这个批处理文件中”。省略它意味着“这是一个外部可执行文件”) CALL 创建一个新的上下文,复制当时存在的环境变量,所以
:sub
echo %first_num% / %second_num% = %result% >> file.txt
goto :eof
将显示执行 a 时环境中的变量CALL :SUB
。请注意GOTO :EOF
(冒号的REQUIRED
意思是“转到文件的物理结尾”-EOF
不应声明标签...
(还要注意流向通常放置在批处理文件末尾的子例程。明智的做法是GOTO :EOF
确保不会发生流向...
#Mod 5 of numbers 1-100:
评论指标正式上线REM
rem Mod 5 of numbers 1-100:
但
::Mod 5 of numbers 1-100:
经常使用,因为它更容易键入 BUT 因为它实际上是对标签的滥用,它实际上是一个标签,并且标签不能用于复合语句中,你不能在括号中使用它IF ... (...) else (...)
orFOR...DO (...)
for i in {1...100}
变成
for /L %%i in (1,1,100) do (
元变量%%i
是区分大小写和单个字符的。在 aFOR /L
元素是(开始,步骤,结束) -FOR /?
从提示(或通常command /?
从提示)中查看 docco...
result=$((i % 5))
变成
set /a result=%%i %% 5
/a
因为 RHS 是要计算的算术表达式;%% 5 因为%
escapes %
,空格无关紧要,处理器需要知道%
正在使用 MOD 运算符,而不是%5
(第五个命令行参数)
int sum=0
没有类型之类的东西;所有环境变量都是字符串,并且只被set /a
语句解释为整数
所以 - 这就是它的全部......