5

当我学习在 Bash 中编码时,我在这里找到了很多可以帮助我的东西,它们都接近但不完全。

我需要输入一个正整数并在一行上打印到一个,全部用逗号分隔,最后一个变量的末尾没有逗号。

这是我到目前为止所拥有的:

#!/bin/bash
#countdown

read -p "Enter a Number great than 1: " counter

until ((counter < 1)); do
echo -n ",$counter"
((counter--))
done

它几乎可以解决,但我不知道如何防止前面的逗号而不是将它放在最后一个变量后面。

编辑:你们太棒了。倒在这本书上,在这里十分钟学到的东西比我在那里花一个小时学到的还要多。

那么我可以使用某种命令来确保它只输入一个数字并确保它必须是正数吗?

某种方式在读取时放置 if 语句以确保其 <= 1 且只有一个字符?

我只有一些基本的 C 编码背景,所以我有基础知识,但将它们翻译成 BASH 比预期的要难

4

5 回答 5

14

seq-s选项一起使用:

seq -s, $counter -1 1 
于 2013-06-12T01:10:16.350 回答
5

使用大括号扩展可能更简单:

#!/bin/bash
#countdown

read -p "Enter a Number great than 1: " counter

eval printf "%s" {${counter}..2}, 1

测试:

Enter a Number great than 1: 10
10,9,8,7,6,5,4,3,2,1

要验证输入,您可以使用正则表达式:

#!/bin/bash
#countdown

read -p "Enter a Number great than 1: " counter

if [[ ${counter} =~ ^[1-9][0-9]*$ ]]
then
  eval printf "%s" {${counter}..2}, 1
fi
于 2013-06-12T01:26:56.400 回答
2

单程

read -p "Enter a Number great than 1: " counter
echo -n "$counter"
((counter--))
until ((counter < 1)); do
echo -n ",$counter"
((counter--))
done
于 2013-06-12T01:08:43.647 回答
1

使用数组、seq命令和子shell 来本地化对IFS参数的更改的稍微笨拙的构造将起作用。

read -p "Enter a Number great than 1: " counter
range=( $(seq $counter -1 1) )
( IFS=,; echo "${range[*]}" )
于 2013-06-12T01:26:15.880 回答
1

这是另一种方式……有点受chepner解决方案的影响,但不使用seq

script.sh 的内容:

#!/bin/bash

read -p "Enter a Number great than 1: " counter
range=( $(eval echo {$counter..1}) )
( IFS=,; echo "${range[*]}" )

测试:

$ bash script.sh
Enter a Number great than 1: 5
5,4,3,2,1
$ bash script.sh
Enter a Number great than 1: 30
30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
于 2013-06-12T02:01:51.483 回答