【问题标题】:Shell Scripting - Check if numbers on an argument are uniqueShell 脚本 - 检查参数上的数字是否唯一
【发布时间】:2012-08-01 19:37:24
【问题描述】:

我正在编写一个脚本,它接受一个 3 位数字并检查它们是否唯一并生成每个数字的文件,例如,如果我运行“myscript 123”,它将生成三个文件:file1、file2 和 file3 但是如果我运行“我的脚本 121”,它将生成 file1 和 file2

我需要帮助来查看参数并比较每个数字,有人可以帮帮我吗?

这是我目前所写的:

if [ $1 -gt 99 ] && [ $1 -lt 1000 ]
then
   echo "Your three digit number: $1"
else
   echo "please restart and enter a 3-digit number"
   exit
fi

【问题讨论】:

  • 为什么不简单地创建两次文件呢?没有造成任何伤害......
  • 这是我正在处理的作业的一部分,它必须检查每个数字并且只创建一次文件。
  • 我最大的挑战是检查 $1 并查看每个数字是什么,我一无所知

标签: linux shell testing scripting arguments


【解决方案1】:

我最大的挑战是检查 $1 并查看每个数字是什么,我一无所知

有几种方法可以从字符串中检索每个字符。例如,您可以在fold 的帮助下将它们拆分为一个数组:

$ IN="123"
$ DIGITS=($(echo $IN | fold -w1))
$ echo ${DIGITS[0]}
1
$ echo ${DIGITS[1]}
2

或者你可以使用变量子串提取(见docs):

$ IN="123"
$ echo ${IN:0:1}
1
$ echo ${IN:1:1}
2

或者,您可以使用let 执行基本的模运算:

$ IN="123"
$ let A="IN % 10"  # get last digit (3rd)
$ ((IN /= 10))     # divide by 10 (which discards last digit)
$ let B="IN % 10"  # get last digit (2nd)
$ ((IN /= 10))     # divide by 10 (which discards last digit)
$ let C="IN % 10"  # get last digit (1st)
$ echo $A
3
$ echo $B
2
$ echo $C
1

【讨论】:

  • 感谢@Shawn 只是为了澄清一下,我的 3 位数号码被分配为 $1: echo ${$1:0:1} 显示第一个数字 echo ${$1:1:1} 显示第二个数字 echo ${$1:1:2} 显示第三个数字?
  • 哎呀,对不起,第三位数字是 echo ${$1:1:2} ?
  • 太棒了,第三个能让我在我有限的知识范围内做到这一点,非常感谢:)
  • 对于变量子字符串的提取,第一个字段是变量名,第二个是位置,第三个是要提取的长度——所以你需要${1:2:1}作为第三个字符。 (我已经编辑了帖子以链接到一些您可能会觉得有用的文档。
  • @PhillToronto 不客气。祝你作业顺利。
【解决方案2】:

您可以使用模数和除法运算符来提取数字,然后进行比较。或者您可以使用“echo”、“head”和“tail”的组合来提取数字。例如:

digit2=$(echo $1|head -c 2|tail -c 1)

【讨论】:

  • 如果必须使用外部进程,cut 会显得更自然。
【解决方案3】:

这只会生成文件名,我从不同的角度来解决这个问题。 我们在这里谈论数字。因此,您最多可以创建十个文件。 因此,我们不是孤立每个数字,而是查找每个数字,看看它是否存在于给定的数字中:

function files_for_digits {
    [[ $1 != [0-9][0-9][0-9] ]]  && 
        echo "specify a three digit number" >&2 && return 1

    typeset i
    for i in {0..9}; do
        [[ $1 == *$i* ]] && echo file$i
    done
}

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 2015-07-16
    • 2011-09-22
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多