我有两个字符串,我想用空格分开并逐两使用它们:
namespaces="Calc Fs"
files="calc.hpp fs.hpp"
例如,我想这样使用:command -q namespace[i] -l files[j]
我是Bourne Shell的菜鸟。
答案 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