Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在命令行参数对上迭代_Linux_Bash_Shell_Unix - Fatal编程技术网

Linux 在命令行参数对上迭代

Linux 在命令行参数对上迭代,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我有一个400多个坐标,我想把它作为一个参数传递到一个字符串中,但我不知道如何把第一个参数作为“lat”传递,把第二个参数作为“lng”传递,以此类推 说我是路过这里 ./test 1 2 3 4 我希望我的输出是 coordinate: {lat: 1, lng: 2} coordinate: {lat: 3, lng: 4} 到目前为止,我已经做到了这一点,但很明显,事情不是这样的 for i in $@ do echo "coordinate: {lat: $i, lng:

我有一个400多个坐标,我想把它作为一个参数传递到一个字符串中,但我不知道如何把第一个参数作为“lat”传递,把第二个参数作为“lng”传递,以此类推

说我是路过这里

./test 1 2 3 4
我希望我的输出是

coordinate: {lat: 1, lng: 2}
coordinate: {lat: 3, lng: 4}
到目前为止,我已经做到了这一点,但很明显,事情不是这样的

for i in $@
do

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

done

您可以使用
shift
(但不要这样做-请参阅下面的注释):


注意
shift;shift
在许多圈子里都比shift 2更受欢迎,因为即使只剩下一个参数,它也能工作<上面的代码>第2档是安全的,因为我们正在比较
$#
以确保始终有两个或多个参数。

您不需要循环:

printf "coordinate: {lat: %s, lng: %s}\n" "$@"

在放入路径之前重命名脚本(类似于/usr/local/bin),因为
test
是一个内置函数。

顺便说一句,$@中的
for i实际上是一个相当多的错误——它将处理
/yourscript“一两”“三四”
/yourscript“一”“二”“三”“四”
完全相同。始终引用
“$@”
。这会将空字符串视为不存在的参数--
/scriptname”“三四个
将永远不会到达
三个
/
四个
对。此外,如果参数数量为奇数,
移位2
可以是noop(返回非零退出状态,但没有任何效果,将现有值保留在
$1
)中,导致无休止的循环。我真的很尴尬,我错过了这个;您完全正确。谢谢您,先生,这真的很有帮助。
#!/usr/bin/env bash
while (( "$#" >= 2 )); do
  echo "coordinate: {lat: $1, lng: $2}"
  shift 2
done
printf "coordinate: {lat: %s, lng: %s}\n" "$@"