这是我第一次尝试编写脚本,我正在尝试创建一个小程序,在循环中执行简单的除法和模运算,然后计算模运算结果的平均值。 这是我在 Linux .sh 中尝试过的,但我如何才能使其与 Windows .bat 兼容?非常感谢您的帮助。
echo "enter first number:"
read first_num
echo “enter second number:”
read second_num
while [ first_num && second_num != 999 ]
do
if [ second_num != 0 ]; then
echo "Enter first number:"
read first_num
echo"Enter second number:"
read second_num
echo first_num "/" second_num "=" $((first_num / second_ num)) >> file.txt
else
echo "ERROR. Cannot divide by 0. Enter another number:"
fi
done
if [ first_num == 999 || second_num == 999 ]; then
echo "You have exited the loop."
fi
#Mod 5 of numbers 1-100:
for i in {1...100}
do
result=$((i % 5))
echo i + "%5=" + result >> file.txt
done
#Average of results:
int sum=0
for (( i=1; i<101; i=i+1 ))
do
sum=sum+$((i % 5))
average=$((sum/100))
echo average
echo average >> file.txt
done
最佳答案
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...)
怪癖:(其中之一):第一个左括号必须出现在与 IF
相同的物理行上,并且 ELSE
必须出现在相同的物理行上作为 on-true statemet 序列的 )
。
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 值替换,然后THEN 执行该行。因此,上面的 ECHO
行将显示输入 IF 语句时的值,而不是计算后的值。
两种治疗方法:
您可以使用 SETLOCAL ENABLEDELATEDEXPANSION
来切换解释器模式。在 DELAYEDEXPANSION 模式下,!var!
可用于检索 var
的运行时值。 SETLOCAL
由 ENDLOCAL
或在同一上下文中到达 END-OF-FILE 终止。 SETLOCAL
之后的任何环境更改都会被 ENDLOCAL
撤消,这就是为什么它通常在 @echo off
之后立即执行 - 保持环境清洁。
第二种治疗方法是使用子程序。 CALL :SUB
(冒号表示“内部子程序 - 开始标签在此批处理文件中”。省略它表示“这是一个外部可执行文件”)CALL 创建一个新的上下文,复制当时存在的环境变量,所以
:sub
echo %first_num% / %second_num% = %result% >> file.txt
goto :eof
将显示执行 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 (...)
或 FOR...DO (...)
for i in {1...100}
成为
for /L %%i in (1,1,100) do (
元变量 %%i
区分大小写并且是单个字符。在 FOR/L
中,元素是 (start,step,end) - 请参阅提示中的 FOR/?
(或者通常是 command/?
从提示中)用于 docco...
result=$((i % 5))
成为
set /a result=%%i %% 5
/a
因为RHS是要求值的算术表达式; %% 5 因为 %
转义了 %
,空间无关紧要,处理器需要知道正在使用 MOD 运算符 %
,而不是 %5
(第五个命令行参数)
int sum=0
没有类型之类的东西;所有环境变量都是字符串,并且仅由 set/a
语句解释为整数
所以 - 这就是它的全部......
关于linux - Windows脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15712681/