0

这是我第一次尝试编写脚本,我正在尝试创建一个小程序,在循环中执行简单的除法和 mod,然后计算 mod 结果的平均值。这是我在 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
4

2 回答 2

3
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 终止。ENDLOCALa 之后的任何环境更改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语句解释为整数

所以 - 这就是它的全部......

于 2013-03-30T05:09:52.450 回答
0

希望你正在寻找这个:

@echo off
setlocal enabledelayedexpansion
> file.txt type nul
:loopInput
echo enter first number:
set /p first_num=
echo enter second number:
set /p second_num=

if !first_num! neq 0 (
    if !second_num! neq 999 (
        if !second_num! equ 0 (
            echo ERROR. Cannot divide by 0. Enter another number:
            goto loopInput
        )
        goto loopDiv
    )
)
goto :skipDiv

:loopDiv
set /a division=first_num/second_num

>> file.txt echo !first_num! / !second_num! = !division!
goto loopInput

:skipDiv
echo You have exited the div loop.

>> file.txt echo Mod 5 of numbers 1-100:
for /l %%a in (1,1,100) do (
    set /a mod=%%a%%5
    >> file.txt echo %%a %% 5 = !mod!
)

set sum=0
for /l %%a in (1,1,100) do (
    set /a sum+=%%a%%5
)
set /a average=sum/100
>> file.txt echo Average of results: !average!
于 2013-03-31T14:54:07.160 回答