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

Unix 如何将命令行上的字符串转换为单个位置参数,unix,command-line,Unix,Command Line,我的主要问题是如何在Linux中使用terminal命令将命令行上的字符串拆分为参数? 例如 在命令行上: /我的节目你好世界10 20 30 参数设置为: $1=你好 $2=世界 $3=1020 但我想: $1=你好 $2=世界 $3=10 $4=20 $5=30 如何才能正确执行此操作?使用xargs: xargs是Unix和大多数使用的类Unix操作系统上的命令 从标准输入构建和执行命令行。命令,例如 grep和awk可以接受标准输入作为参数或参数 通过使用管道。然而,cp和echo等其他

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

/我的节目你好世界10 20 30

参数设置为:

$1=你好

$2=世界

$3=1020

但我想:

$1=你好

$2=世界

$3=10

$4=20

$5=30

如何才能正确执行此操作?

使用xargs:

xargs是Unix和大多数使用的类Unix操作系统上的命令 从标准输入构建和执行命令行。命令,例如 grep和awk可以接受标准输入作为参数或参数 通过使用管道。然而,cp和echo等其他公司则忽略了这一点 标准输入流,并且仅依赖于 命令此外,在版本2.6.23之前的Linux内核中, 在许多其他类似Unix的系统中,任意长的 无法将参数传递给命令[1],因此xargs会破坏列表 将参数分为小到可以接受的子列表


您可以使用内置的重置位置参数$@。如果您这样做,外壳将拆分它,产生您想要的行为:

$ 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——但这似乎是您的要求。

这是为您编写的程序设计的吗?您是否可以选择更改参数的传入方式?如果你这样做了,你可以删除引号来分隔数字。我不能这样做,因为这是用户的预期输入。为了让它工作,我必须把它放在命令行上。如何将echo 10 20 30 | xargs./my_程序hello world编码到程序中?您可以直接将其放入bash脚本中。试试看,看看能不能用。
$ 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