我是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
答案 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)
还有更多方法:
这并不是完全提供您想要的输出,但是很简短明了。
#!/bin/bash
printf "Person: %s %s\n" "$@" | nl -s ". "
使用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
循环),你有几个选择我都不推荐。
使用printf
命令代替echo
进行输出。当count%2
为零时,请打印count/2
,$x
作为名字,不要换行。当count%2
为1时,请打印$x
作为姓氏和换行符。那就是count
从零开始。
即使您当前的设置,您可能希望循环"$@"
而不是$*
。有些人可能在其名称中有合法的空格,例如"Billy Bob" Thornton
。
您可以对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