[other] 求助一下,帮忙看看为啥for循环报错
Tofloor
poster avatar
null
deepin
2024-07-04 22:34
Author

现在shell脚本是不是改了,一直报错,ai帮忙写的也是报错爱

cal_test: 6: Syntax error: Bad for loop variable

这个是ai写的
1720103616510.png

Reply Favorite View the author
All Replies
null
deepin
2024-07-04 22:39
#1

抄书也不行,奇怪了
image.png

Reply View the author
观摩
deepin
2024-07-04 22:40
#2

shell脚本里面我还没用过for循环呢

#!/bin/bash

s=0
for((i=0; i<5; i++))
do
    s=$((s+i))
    echo "  $i: $s"
done
echo "result is: $s"

0: 0
1: 1
2: 3
3: 6
4: 10
result is: 10

Reply View the author
神末shenmo
deepin
Spark-App
2024-07-04 22:49
#3

${变量}不是 {$}变量

Reply View the author
北冥夜未央
deepin
Ecological co-builder
2024-07-05 08:03
#4
null

抄书也不行,奇怪了
image.png

有错误的书太多了,大学谭浩强那本教材都一堆错误,何况普通的书呢

Reply View the author
lianghb
deepin
2024-07-05 08:41
#5

要编写一个Shell脚本来生成自然数的和,可以使用循环来实现。以下是一个简单的Shell脚本示例,它计算从1到指定数字(比如100)的所有自然数的和:

#!/bin/bash

# 提示用户输入一个数字
echo "请输入一个正整数:"
read n

# 初始化变量 sum 用来存储和
sum=0

# 使用循环计算自然数的和
for (( i=1; i<=$n; i++ ))
do
    sum=$((sum + i))
done

# 输出结果
echo "从1到$n 的自然数的和为: $sum"

让我们来解释一下这个脚本:

  1. #!/bin/bash 表示这是一个bash脚本。
  2. echo "请输入一个正整数:" read n 用来提示用户输入一个正整数,并将输入的值存储在变量 n 中。
  3. sum=0 初始化变量 sum,用来存储自然数的和。
  4. for (( i=1; i<=$n; i++ )) 是一个循环,从1开始逐步增加,直到达到用户输入的数字 n
  5. sum=$((sum + i)) 在每次迭代中,将当前的数值 i 加到 sum 上。
  6. 最后,输出结果 echo "从1到$n 的自然数的和为: $sum",显示从1到用户输入的数字 n 的所有自然数的和。

你可以在命令行中运行这个脚本,并按照提示输入一个数字,然后它将计算并输出从1到该数字的所有自然数的和。

Reply View the author
kero990
deepin
2024-07-05 10:12
#6

我执行的结果为啥是这样,虽然没有报错

image.png

Reply View the author
kero990
deepin
2024-07-05 10:16
#7

另外,ai和ai差的远了,建议换个强一点的

image.png

Reply View the author
raspbian
deepin
2024-07-05 12:34
#8

哪个ai会告诉你shell里可以这么写for循环?

Reply View the author
观摩
deepin
2024-07-05 18:05
#9
kero990

我执行的结果为啥是这样,虽然没有报错

image.png

楼主自己贴出来的脚本是错误的,有问题。

其他人贴的脚本都可以正常执行

Reply View the author
魔法师
deepin
2024-07-06 20:11
#10

https://gitee.com/zinface/bash-completion.ywloader/blob/master/old-bash-completion/ywloader

这是我的一个工具的 bash 补全脚本(原始版本),里面有大量注释,适合学习。
可以搜索 for 找到一些用法,另外,bash 补全脚本非常考验在有限的信息下完成各种不同的任务以赋予命令行程序灵魂。

$ ywloader use <与第二个参数相隔一个空格后为tab键补全点>
# ^主命令   ^子命令

提供到补全脚本的信息只有:
1. words:  [ywloader use] 两个数据(所有词)
2. prev:  [use]  一个数据(上一个词)
3. cword:  []   空数据(如果补全点为第三个参数的部分:如 ywloader use cm<补全点>,那么 cword 是 [cm])
4. cur:  2   数值(当前词位置,从0开始)


根据以上有限信息来完成二级命令的补全,补全脚本的使命就是为 ywloader 命令提供全部可用数据(并预判可能需要的词)

后来,因为这个命令要补全的条目项太多,用旧的 bash 补全脚本性能不够用,为了重构,目前永远的保留了这个包含注释的版本。

新的版本更加巧妙,本质上仍是通过 ywloader list 来列出所有项进行重组输出,但相比旧的版本,新的版本直接使用了 ywloader list 提供的细节 --xxx 参数,直接输出一个列表充当补全数据,而不需要在补全脚本中进行字符串遍历、分割、重组为数组到变量中(性能从 1s 变成了 0.1s,说明 bash 的数据处理性能太垃圾了,补全操作我 tab 是无限按的)

Reply View the author
null
deepin
2024-07-06 21:26
#11
raspbian

哪个ai会告诉你shell里可以这么写for循环?

讯飞星火

Reply View the author
null
deepin
2024-07-06 21:28
#12
kero990

另外,ai和ai差的远了,建议换个强一点的

image.png

请问一下这个是什么ai

Reply View the author
raspbian
deepin
2024-07-10 08:19
#13
null

讯飞星火

我曾经接触过一个职位 就是给ai生成的代码查错的

所以

蹲在提款机里数钱的人是真的存在

Reply View the author
兰蔻
deepin
2024-07-10 11:54
#14

两个错误:

  • 把参数的扩展语法 ${s} 错写成 {$}s
  • 在 dash Shell 中使用了不支持的算术 for 语法

更正:

如果是 dash Shell,则不能使用算术 for 语法,因为 dash 不支持该语法。可以换成 for 迭代循环结构:

#!/bin/dash

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PATH
read -p "please input a number , I will count 1+2...+your input: " nu
s=0
for i in `seq 1 $nu` ; do
    s=$((s+i))
done
echo "result in $s "

如果要使用算术 for 语法,则需要把脚本开头的 #!/bin/dash 改成 #!/bin/bash

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PATH
read -p "please input a number , I will count 1+2...+your input: " nu
s=0
for((i=1;i<=nu;++i)){
    s=$((s+i))
}
echo "result in $s "

此外,在 Shell 中进行算术运算时,如果遇到变量,应尽可能地避免使用参数扩展语法。也就是说,应该尽量直接使用变量名,而不是在变量名前面加 $ 符号,除非是特殊参数或位置参数。实际上,当变量没有设置或值为空时,在算术表达式中 $ii 并非等价,例如

Screenshot_20240710_113645.png

上面的例子中,我们先执行了 unset i 取消设置变量 i 。接着执行 echo $(($i * 5)) 时,出现了语法错误,这是因为,$i 执行的是参数扩展,bash 会把 i 当成参数表达式(而不是一个算术表达式),并扩展为空字符串,从而导致因 * 5 前面没有操作数而出现语法错误。当执行 echo $((i * 5)) 时,就没有这个问题,这是因为,在算术表达式中,未设置或值为空的变量会被视为 0 值。

Reply View the author