2017-04-18 57 views
1

所以这是我到目前为止的代码(IM新打坏,所以我知道这可能是凌乱):庆典 - 在直方图剧情脚本getopts的参数错误

#!/bin/bash 

while getopts ":cs:p:" opt; do 
    case $opt in 
     c)COUNT="hello";; 
     s)NUM=$OPTARG;; 
     p)CHAR="$OPTARG";; 
     \?) exit 1;; 
    esac 
done 

shift $((OPTIND - 1)) 

while read number value; do 
    printf "%3d " $number 
    if [ ! -z $COUNT ]; then 
     printf "%5d " $value 
    fi 
    if [ $NUM ]; then 
     for i in $(seq 1 {$value/$NUM}); do 
      if [ ! -z $CHAR ]; then 
       printf "%s" $CHAR 
      else 
       printf "#" 
      fi 
     done 
    else 
     for i in $(seq 1 $value); do 
      if [ ! -z $CHAR ]; then 
       printf "%s" $CHAR 
      else 
       printf "#" 
      fi 
     done 
    fi 
    printf "\n" 
done <${1:-/dev/stdin} 

那么这段代码是在线路发生输入格式为{行长度,发生次数}或{x,y},脚本将使用行长和'#'字符的直方图绘制数据。

第一个问题:

我的getopts的工作正常,除了“-s NUM”,在它正试图通过$ NUM(输入号码进行分割,分割$值时,输出错误通过)。这应该会减少使用NUM作为标量打印的#个字符的数量。 我可以运行命令“./histoplot -c -p'$'textfile.txt”完全没问题,它做它需要做的事情。但是当我运行“./histoplot -s 3 textfile.txt”时,它输出错误:seq:无效的浮点参数:'{x/y}

我该怎么做才能使其正常工作?

第二个问题:

与含有输入文件

所以:

3 4 
4 1 
5 3 
10 1 

输出应(对命令 “./histoplot -c [或任何其他选项] [inputfile中]” :?

1 0 
    2 0 
    3 4 #### 
    4 1 # 
    5 3 ### 
    6 0 
    7 0 
    8 0 
    9 0 
10 1 # 

但是我的输出不包含哪里有0出现 任何想法长度

在此先感谢帮助球员,我真的很感激!

编辑:

的第一个问题已经解决了,刚刚离开第二个问题。任何人有任何想法? :)

+0

此外,由$ value/$ NUM确定的数字需要向下舍入,所以如果它相当于4.57,则打印的字符数将是4. – Swallows

回答

1

的原因您一日问题是因为

for i in $(seq 1 {$value/$NUM}); 

这在语法上是不正确,因为您没有使用运营商$((..))用算术方面的变量,bash C风格的for-loop只是做

for ((i=1; i<=$((value/NUM)); i++)); 

此外,bash不做浮点arithm etic,并且它总是将向下移动到以在整数除法中使用时的最低数字。

+0

感谢您的帮助,它工作正常!这是否自动总是舍入?所以,x/y = 4.57 = 4? – Swallows

+0

@Swallows:是的,引用我的更新,你可以自己手动确认它,做'echo $((7/4))''1.75'产生'1' – Inian

+1

你是一个传奇人物,感谢助攻!对于问题2的任何想法?:) – Swallows