Bash for loop打印两个参数

时间:2018-04-15 10:46:23

标签: bash

我是bash的新手,想要编写一个带有大量参数的简单程序。该脚本应始终采用两个参数,并将它们作为姓氏打印在一行中。脚本的用法可以是:

getnames John Doe Max Muster Tim Stone

输出应为:

1. Person: John Doe
2. Person: Max Muster
3. Person: Tim Stone

我现在得到的输出:

::> getnames John Doe Max Muster Tim Stone
/home/user/bin/getnames: line 17: x: command not found
1. Person: John 
/home/user/bin/getnames: line 17: x: command not found
2. Person: Doe 
/home/user/bin/getnames: line 17: x: command not found
3. Person: Max 
/home/user/bin/getnames: line 17: x: command not found
4. Person: Muster 
/home/user/bin/getnames: line 17: x: command not found
5. Person: Tim 
/home/user/bin/getnames: line 17: x: command not found
6. Person: Stone 

以下是我到目前为止编写的代码:

#!/bin/bash

if [ $# -eq 0 ]; then
        echo "No names given"
        exit 1
elif [ $# -lt 2 ]; then
        echo "Please enter at least one first and one last name"
        exit 1
elif [ $(($#%2)) -ne 0 ]; then
        echo "Please always enter a first name and a last name for one person"
        exit 1
fi

count=1

for x in $*; do
        echo "$count. Person: $x $(x + 1)"
        let "x+=2"
        let count++
done

4 个答案:

答案 0 :(得分:3)

使用 shift 命令。

if [ $# -eq 0 ]; then
        echo "No names given"
        exit 1
elif [ $# -lt 2 ]; then
        echo "Please enter at least one first and one last name"
        exit 1
elif [ $(($#%2)) -ne 0 ]; then
        echo "Please always enter a first name and a last name for one person"
        exit 1
fi

count=1

while (( "$#" )); do
        echo "$((count++)). Person: $1 $2"
        shift 2
done

答案 1 :(得分:3)

还有更多方法:

  1. 这并不是完全提供您想要的输出,但是很简短明了。

    #!/bin/bash
    printf "Person: %s %s\n" "$@" | nl -s ". "
    
  2. 使用for循环并使用variable indirection

    for ((i=2; i<=$#; i+=2)); do 
        j=$((i-1))
        printf "%d. Person %s %s\n" $((i/2)) "${!j}" "${!i}"
    done
    

答案 2 :(得分:1)

执行此操作的简便方法是使用shift,如tso's answer所示。如果你绝对坚持这么做(使用for循环),你有几个选择我都不推荐

  1. 使用printf命令代替echo进行输出。当count%2为零时,请打印count/2$x作为名字,不要换行。当count%2为1时,请打印$x作为姓氏和换行符。那就是count从零开始。

    即使您当前的设置,您可能希望循环"$@"而不是$*。有些人可能在其名称中有合法的空格,例如"Billy Bob" Thornton

  2. 您可以对1到$#之间的数字进行循环,然后使用indirect variable referencing。 IVR使用变量来命名另一个变量。

    旧的便携式间接方式可能是eval FIRST="\$$x"FIRST="$(eval \$$x)"。从版本2.0开始,bash允许您执行FIRST="${!x}"。这个新表单在shell之间是not a standard notation

答案 3 :(得分:0)

使用for循环

for x ; do
    let count++
    if [ $((count%2)) -eq 1 ] ; then
            name="$x"
    else
            echo "$((count/2)). Person: $name $x"
    fi
done