【问题标题】:How to parse integers as command line arguments?如何将整数解析为命令行参数?
【发布时间】:2022-01-11 22:41:01
【问题描述】:

我想将整数作为命令行参数输入到 shell 脚本中,并使用这些整数进行基本的字符串操作。

例如:

# POSIX Shell
user@host $ ./script 3 4 1 5
^
| * * *
| * * * *
| *
| * * * * *
------------

user@host $

还有一些伪代码来演示,我想如何实现这一点:

# Pseudocode
#!/bin/sh
for arg in $#; do
    echo $((arg * '* '))
done

# Or something similar with a loop ;-)

如果有人有一个想法可以在像 /bin/sh 这样的纯 POSIX Shell 中引导我走向正确的方向,那就太好了!

【问题讨论】:

  • 只有 Python 允许你“乘”字符串。在其他语言中,您将使用循环。
  • @thatotherguy 感谢您的回答!想法,如何做到这一点?
  • 查看How do I write a 'for' loop in Bash? 了解如何对某个整数 N 重复操作 N 次
  • for arg in $#; do 将只迭代一次,arg 设置为传递给脚本的参数数量。您的意思当然是for arg in "$@"(可以(并且IMO应该)缩短为for arg; do ...
  • yes '* ' | sed ${arg}q | tr -d \\n ; echo,但请确保您首先验证输入是否为整数。

标签: linux shell unix posix


【解决方案1】:
$ cat script 
#!/bin/sh

for arg in "$@"; do
    yes | tr y '*' | head -n "$arg" | xargs
done
$ ./script 3 4 1 5
* * *
* * * *
*
* * * * *

替代方案:

$ cat script2 
#!/bin/sh

for arg in "$@"; do
    tr '\0' '*' < /dev/zero | head -c "$arg" | sed 's/./* /g'
    echo
done
$ ./script2 3 4 1 5
* * * 
* * * * 
* 
* * * * * 

【讨论】:

    【解决方案2】:

    我相信这是您正在寻找的关键,并且也应该严格遵守 POSIXly:

    #! /bin/sh
    
    for n; do
      printf '| ';
      i=0;
      while [ $i -lt $n ]; do
        printf '* ';
        i=$(( i + 1 ));
      done
      printf '\n';
    done
    

    【讨论】:

    • 一个警告:您需要验证参数。如果$n 不是整数,这将表现得很奇怪。也许:for n; do test "$n" -gt 0 2&gt;&amp; /dev/null || continue; ...
    【解决方案3】:

    有很多方法可以给这只猫剥皮。这是一个:

    #!/bin/bash
    array=( "$@" )
    
    function repeat() { num="${2:-100}"; printf -- "$1%.0s" $(seq 1 $num); printf '\n'; }
    
    arraylength=${#array[@]}
    for (( i=0; i<${arraylength}; i++ ));
    do
       if [[ ${array[$i]} -ge $max ]]; then
            max=${array[$i]}
       fi
       printf '%s' '| '
       repeat '* ' ${array[$i]}
    done
    
    repeat '-' $(( $max+$max+3 ))
    

    或者在awk

    echo "3 4 1 5" | awk 'function a(b,c){r="";while(c-->0)r=r b;print r}{for(i=1;i<=NF;++i){printf "| ";a("* ",$i);if(m<$i)m=$i}}END{a("-",(m*2)+3)}'
    

    【讨论】:

      猜你喜欢
      • 2014-03-11
      • 2019-09-04
      • 2011-04-27
      • 2011-06-15
      • 1970-01-01
      • 2013-03-21
      相关资源
      最近更新 更多