我的主要问题是如何在Linux中使用terminal命令将命令行上的字符串拆分为参数? 例如 在命令行上:
./my program hello world "10 20 30"
参数设置为:
$ 1 =你好
$ 2 =世界
$ 3 = 10 20 30
但我想:
$ 1 =你好
$ 2 =世界
$ 3 = 10
$ 4 = 20
$ 5 = 30
我该如何正确地做到这一点?
答案 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” - 但这似乎是你的要求。