2017-06-14 71 views
3

我有一个超过400个坐标,我想作为参数传递给一个字符串,但我不知道如何将第一个参数作为“经纬度”和第二个参数作为“ lng“等等。遍历命令行参数对

说我是路过这个

./test 1 2 3 4 

我希望我的输出是

coordinate: {lat: 1, lng: 2} 
coordinate: {lat: 3, lng: 4} 

这是我到目前为止,但显然这不是它是如何做。

for i in [email protected] 
do 

    echo "coordinate: {lat: $i, lng: $i}" 

done 
+0

顺便说一句,'for i in $ @'实际上很麻烦 - 它会把'./yourscript“一二”“三四”'和'./yourscript“一样” “两”“三”“四”“。总是引用'“$ @”'。 –

回答

4
#!/usr/bin/env bash 
while (("$#" >= 2)); do 
    echo "coordinate: {lat: $1, lng: $2}" 
    shift 2 
done 

注意shift; shift在许多圈子优于shift 2,因为它的工作原理即使只剩下一个论点, shift 2仅仅是因为我们比较$#以确保始终有两个或更多参数。

+0

谢谢先生,这真的很有帮助。 –

0

你可以使用shift(但不要做这样的 - 见下面的评论):

while [ -n "$1" ] 
do 
    echo "{coordinate: {lat: $1, lng $2}" 
    shift 2 
done 
+0

这将空字符串视为不存在的参数 - './scriptname“”“”three four'将永远不会到达“three' /'four'对。 –

+0

另外,如果你有一个奇数的参数,'shift 2'可以是一个noop(返回一个非零退出状态,但根本没有任何作用,将现有值留在$ 1中),导致无限循环。 –

+0

@CharlesDuffy好的,谢谢 –

3

你并不需要一个循环:

printf "coordinate: {lat: %s, lng: %s}\n" "[email protected]" 

,并把您的路径之前重命名您的脚本(像在/ usr/local/bin目录),因为test是一个内置函数。

+1

我真的很尴尬,我错过了这一点;你完全正确。 –