linux - Windows脚本

标签 linux windows scripting batch-file

这是我第一次尝试编写脚本,我正在尝试创建一个小程序,在循环中执行简单的除法和模运算,然后计算模运算结果的平均值。 这是我在 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 的运行时值。 SETLOCALENDLOCAL 或在同一上下文中到达 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/

相关文章:

Python Netsnmp 和 snmpwalk

ios - ios 中的 Windows azure 事件目录身份验证

c# - 如何获取网络适配器索引?

linux - 如何创建一个 Unix 脚本来逐行分离数据?

python - popen 发送命令到

php - 如何从 ash (bash) 将数据发布到 php

bash - 如何获取使用bash制表的变量的值

linux - 如何在继续我的脚本之前等待 dd 命令完成复制?

linux - 重定位错误和 Linux 软件分发

c - 带/不带控制台的 Windows 启动过程