循环整数时

循环整数时

我是 Linux 新手,正在学习一个让我抓狂的在线课程。老师讲课和解释的速度太快了,即使倒带也跟不上。我知道这对在座的许多人来说可能很简单,但我需要做的任务是......

  1. 将脚本命名为 while.sh。
  2. 要求用户输入一个正整数。您可以假设用户将输入一个正整数(不需要输入验证)。
  3. 使用 while 循环打印从 0 到输入的整数(包括输入的整数)的所有整数。每个整数都应该单独打印在一行上,并且不应打印其他任何内容。

我需要做什么才能做到这一点?

答案1

由于您的文件要命名while.sh,我想您会想要使用sh语法。

你需要:

  • 读取输入的命令。大多数文本实用程序都可以做到这一点(这是它们默认执行的操作)。sh还有一个read内置命令可将输入读取到变量中。
  • 写入输出和提示的命令。为此有很多命令。该printf命令可以做到这一点,并且内置在大多数sh解释器中,但由于在这里,您想要输出几项内容,因此您可能需要使用可以在循环中多次执行此操作的命令。
  • 一种进行整数算术的方法。为此有几个命令。sh该语言也具有内置的功能。

碰巧的是,该awk命令可以执行上述所有操作,并且恰好有一个while()构造。

#! /bin/sh -
awk '
  BEGIN {printf "Please enter a positive integer number: "}
  {while(i <= $0) print i++; exit}'

在这里,你实际上不需要sh,你也可以这样写:

#! /usr/bin/awk -f
BEGIN {printf "Please enter a positive integer number: "}
{while(i <= $0) print i++; exit}

bc是另一个几乎拥有全部 3 个命令的命令。它缺乏读取用户输入的能力,尽管 GNU 实现确实支持它作为扩展:

#! /usr/bin/bc -q
"Please enter a prositive integer number: "
n = read()
i = 0
while (i <= n) i++
quit

您还可以使用 shell 的while构造并在循环中调用多个命令,但那就是通常被认为是不好的做法,效率较低,并且代码相当丑陋(如果您想验证用户输入,则awk可以提供比 shell 的内部功能(case构造)更好的功能):

#! /bin/sh -
printf 'Please enter a positive integer number: ' || exit
IFS= read -r number || [ -n "$number" ] || exit
i=0; while [ "$i" -le "$number" ]; do
  printf '%s\n' "$i" || exit
  i=$((i + 1))
done

除此之外sh,最多可达 3 + 2 × (数字+ 2) 命令([readprintf,幸运的是内置了大多数sh解释器)!与使用awk或以上的单个命令调用进行比较bc

另请注意,一些系统有一个seq专门设计用于输出数字序列的命令,每行一个(例如seq 0 "$number")。 Shell 脚本(shell 位于所有命令行解释器之前)首先是为任务调用正确的命令。这与编程无关,所以我觉得很奇怪,你的老师会要求你使用 shell 的while循环。

答案2

使用vi while.sh,使用以下脚本创建一个新文件:

#!/bin/bash

COUNTER=0

echo "Enter a integer positive number: "
read NUMBER

echo "Numbers from 0 to $NUMBER: "
while [ $NUMBER -ge $COUNTER ]; do
  echo $COUNTER
  ((COUNTER++))
done

然后,使用chmod +x while.sh授予其执行权限。使用 调用脚本./while.sh,输入整数并按 Enter 键(无验证)。它返回:

user@Notebook:/tmp$ ./while.sh 
Enter a integer positive number: 
5
Numbers from 0 to 5: 
0
1
2
3
4
5

man为了更好地理解,阅读 while、read、bash 变量和比较的文档非常重要。做这件事有很多种方法。这只是一个最简单的。

[编辑] @user218863,回复您对商店列表的评论,您可以尝试以下操作:

#!/bin/bash -

echo "Enter items separated by a space:"
IFS= read -r LIST

IFS=' ' # split on space only
set -o noglob # disable glob
for item in $LIST; do
   printf '%s\n' "$item" || break
done >> shopping_list
echo "List:"
cat shopping_list

这将创建一个名为 shopping_list 的文件,其中包含每个键入的单词,以及cat循环后的文件。如果答案对您有帮助,请采纳:)

相关内容