根据Bash中的输入生成以逗号分隔的数字序列

时间:2013-06-12 01:04:20

标签: bash shell scripting

我发现这里有很多东西可以帮助我,因为我正在学习用Bash编码,而且它们都很接近但不完全。

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

这是我到目前为止所做的:

#!/bin/bash
#countdown

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

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

它几乎可以解决,但我无法弄清楚如何防止前面的逗号,而不是在最后一个变量后面。

编辑:你们真是太棒了。倾倒在这本书上,并在十分钟内学到的东西比在那里一小时学到的更多。

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

在读取上放置if语句以确保其&lt; = 1并且只有一个字符的某种方式?

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

5 个答案:

答案 0 :(得分:10)

seq-s选项一起使用:

seq -s, $counter -1 1 

答案 1 :(得分:5)

可能使用brace expansion简化:

#!/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

答案 2 :(得分:2)

单程

read -p "Enter a Number great than 1: " counter
echo -n "$counter"
((counter--))
until ((counter < 1)); do
echo -n ",$counter"
((counter--))
done

答案 3 :(得分:1)

使用数组,seq命令以及用于本地化IFS参数更改的子shell的稍微笨拙的构造将起作用。

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

答案 4 :(得分:1)

这是另一种方式......有点受chepner's解决方案影响但未使用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