关于在 shell 脚本中的 for 循环中使用变量和文件的一些问题

关于在 shell 脚本中的 for 循环中使用变量和文件的一些问题

我有这个问题需要解决。除了修改我在 AWS 终端上的权限之外,我在工作中几乎不使用任何 Linux,所以我的知识不是很多。我也找了很长一段时间,但我发现我认为可能有效的所有东西都不起作用。我正在使用 Ubuntu 并创建一个简单的 shell 脚本并使用 bash 运行它。

  1. 有没有办法从 read 中获取用户整数输入,然后在 for 循环中单独使用每个数字?例如,如果我读取了命令,并且他们输入了 3 4 45 5,仅用空格分隔,然后我可以单独循环遍历每个命令并将它们全部添加到总和中吗?

  2. 在同一个循环中使用文件怎么样?如果我有 file.txt 在单行 3 4 45 5 上保存相同的值,我可以循环遍历这些值以执行将它们添加在一起的相同功能吗?

  3. 在 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 算术评估中使用未经净化的数据的安全影响

相关内容