如何将命令行上的字符串转换为单独的位置参数

时间:2015-04-27 23:30:02

标签: unix command-line

我的主要问题是如何在Linux中使用terminal命令将命令行上的字符串拆分为参数? 例如  在命令行上:

./my program hello world "10 20 30"

参数设置为:

$ 1 =你好

$ 2 =世界

$ 3 = 10 20 30

但我想:

$ 1 =你好

$ 2 =世界

$ 3 = 10

$ 4 = 20

$ 5 = 30

我该如何正确地做到这一点?

2 个答案:

答案 0 :(得分:0)

使用xargs

echo "10 20 30" | xargs ./my_program hello world
  

xargs 是Unix上的一个命令,使用的是大多数类Unix操作系统   从标准输入构建和执行命令行。命令如   grep和awk可以接受标准输入作为参数或参数   通过使用管道。然而,其他如cp和echo无视   标准输入流并且完全依赖于之后发现的参数   命令。另外,在版本2.6.23之前的Linux内核下,   在许多其他类Unix系统下,任意长的列表   参数不能传递给命令,[1]因此xargs打破了列表   将参数列入小到可以接受的子列表中。

source

答案 1 :(得分:0)

您可以使用set内置来重置位置参数$@。如果你执行not double-quote $@,shell将对其进行分词,从而产生您想要的行为:

$ cat my_program.sh
#! /bin/sh
i=1
for PARAM; do
  echo "$i = $PARAM";
  i=$(( $i + 1 ));
done

set -- $@
echo "Reset \$@ with word-split params"

i=1
for PARAM; do
  echo "$i = $PARAM";
  i=$(( $i + 1 ));
done

$ sh ./my_program.sh foo bar "baz buz"
1 = foo
2 = bar
3 = baz buz
Reset $@ with word-split params
1 = foo
2 = bar
3 = baz
4 = buz

顺便说一句,我发现你想要这样做有点令人惊讶。许多shell程序员对shell的简单,偶然的分词感到沮丧 - 当他们想要保留“John Smith”时,他们会得到“John”,“Smith” - 但这似乎是你的要求。