如何在shell中拆分字符串?

时间:2012-02-18 22:20:48

标签: shell

我有两个字符串,我想用空格分开并逐两使用它们:

namespaces="Calc Fs"
files="calc.hpp fs.hpp"

例如,我想这样使用:command -q namespace[i] -l files[j]

我是Bourne Shell的菜鸟。

5 个答案:

答案 0 :(得分:3)

将它们放入如下数组:

#!/bin/bash

namespaces="Calc Fs"
files="calc.hpp fs.hpp"
i=1
j=0

name_arr=( $namespaces )
file_arr=( $files )

command -q "${name_arr[i]}" -l "${file_arr[j]}"

答案 1 :(得分:2)

echo "hello world" | awk '{split($0, array, " ")} END{print array[2]}'

是你如何分割一个简单的字符串。

答案 2 :(得分:1)

如果你想要做的是循环两个分裂字符串的组合,那么你想要这样的东西:

for namespace in $namespaces
do
   for file in $files
   do
      command -q $namespace -l $file
   done
done

编辑: 或者扩展已发布的awk解决方案,您也可以这样做:

 echo $foo | awk '{print $'$i'}'

编辑2:

免责声明:我根本不认为自己是awk的任何专家,所以这个解释可能会有小错误。

基本上上面的代码片段是将$foo的内容传递到awk的标准输入中。 Awk逐行读取它的标准,将每一行分成基于字段分隔符的字段,默认情况下是任意数量的空格。 Awk执行作为参数给出的程序。在这种情况下,shell将'{ print $'$1' }'扩展为{ print $1 },它只是告诉awk打印其输入的每一行的第1个字段。

如果你想了解更多我认为this blog post在描述基础知识(以及sed和grep的基础知识)方面做得非常好,如果你在开始时跳过更多理论的东西(除非你是那种东西。)

答案 3 :(得分:1)

我想找到一种没有数组的方法,这里是:

paste -d " " <(tr " " "\n" <<< $namespaces) <(tr " " "\n" <<< $files) |
  while read namespace file; do
    command -q $namespace -l $file
  done

这里有两个特殊用法:进程替换(<(...))和这里的字符串(<<<)。这里的字符串是echo $namespaces | tr " " "\n"的快捷方式。进程替换是fifo创建的快捷方式,它允许使用命令输出而不是文件来运行paste

答案 4 :(得分:1)

如果您使用 zsh ,这可能非常简单:

files="calc.hpp fs.hpp"

# all elements
print -l ${(s/ /)files}

# just the first one
echo ${${(s/ /)files}[1]} # just the first one