我有这个问题需要解决。除了修改我在 AWS 终端上的权限之外,我在工作中几乎不使用任何 Linux,所以我的知识不是很多。我也找了很长一段时间,但我发现我认为可能有效的所有东西都不起作用。我正在使用 Ubuntu 并创建一个简单的 shell 脚本并使用 bash 运行它。
有没有办法从 read 中获取用户整数输入,然后在 for 循环中单独使用每个数字?例如,如果我读取了命令,并且他们输入了 3 4 45 5,仅用空格分隔,然后我可以单独循环遍历每个命令并将它们全部添加到总和中吗?
在同一个循环中使用文件怎么样?如果我有 file.txt 在单行 3 4 45 5 上保存相同的值,我可以循环遍历这些值以执行将它们添加在一起的相同功能吗?
在 for 循环中使用变量的正确格式是什么?下面正确吗?我看到了很多不同的方式。
#this is what I was trying
read var
sum = 0 #even the sum doesn't seem to work I dont see a different way to declare a number though
for i in '${var[0]}'
do
$((sum += i)) #confused here also have seen ('$sum' += '$i')
done
echo '$sum'
同样,这就是我试图对文件执行的操作,但我使用文件代替变量
files = "/Documents/numbers.txt"
for i in $files
抱歉,如果这太简单了,但几年前在学校时,除了基本的东西之外,我对大多数东西都是全新的。
答案1
read var
sum = 0
应该是sum=0
,不带空格,请参阅:shell 脚本中变量赋值中的空格
for i in '${var[0]}'
"${var[0]}"
如果您希望变量扩展而不是获取文字字符串,请使用双引号,请参阅:"..."、'...'、$'...' 和 $"..." 引号之间有什么区别?
虽然由于您只有一个标量变量,所以对其进行索引有点混乱(${var[0]}
与 相同$var
,但其他索引会给您空值),所以只需使用for i in "$var"
.
$((sum += i))
这有效,但也扩展到结果,shell 尝试将其作为命令运行。你会得到类似的错误bash: 3: command not found
。使用((sum += i))
(不带美元符号)或sum=$((sum + i))
.看:https://mywiki.wooledge.org/BashGuide/CompoundCommands#Arithmetic_Evaluation
echo '$sum'
var
与:相同echo "$sum"
。
如果我读取了命令并且他们输入了 3 4 45 5 仅用空格分隔,然后我可以单独循环遍历每个命令并将它们全部添加到总和中吗?
你可以做
read var
for x in $var; do ...
这次没有引号。
这依赖于 shell 分割未加引号的变量的结果。通常你应该避免这样做,这是错误的来源。文件名通配也会发生,例如,如果用户输入*
,它会扩展到当前目录中的所有文件。看:为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?和https://mywiki.wooledge.org/WordSplitting
files = "/Documents/numbers.txt"
首先,再次删除空格。然后,将文件名分配给变量。 shell 实际上无法猜测您打算读取该文件。我们必须明确告诉它运行命令来执行此操作,并保存输出(而不是仅仅将其打印在屏幕上)。就像这样:files=$(cat "/Documents/numbers.txt")
。
请注意,如果不包含数字,算术 ( $((sum + i))
) 会做奇怪的事情,它甚至可以被诱骗运行任意命令,所以在现实生活中,你i
应该验证输入仅包含数字...请参阅:在 Shell 算术评估中使用未经净化的数据的安全影响