variable_list="
any:any:-a -b -c any
one:one:-c -b -f -m mul
mul:one:-c -b -f -m mul
"
for f in `echo $variable_list`
do
c1=`echo $f | cut -d':' -f1`;
c2=`echo $f | cut -d':' -f2`;
c3=`echo $f | cut -d':' -f3-`;
echo "c1==>$c1 and c2==>$c2 and c3==>$c3";
#exit 0; ###I made mistake here
done;
预期输出:
c1==>any and c2==>any and c3==>-a -b -c any
c1==>one and c2==>one and c3==>-c -b -f -m mul
c1==>mul and c2==>one and c3==>-c -b -f -m mul
编辑1:
我意识到我在使用脚本时很愚蠢,并且在第一次迭代时我exit 0
只测试第一行,因为我有很多真实的。它按照它必须的方式工作。
我可以通过维护variable_list
而不修改输入的格式/方式来实现上述输出吗?
(我正在使用 bash)
您的问题与数据中的空格有关。shell 会将字符串拆分为所有空格上的单词,并且
for
循环将遍历这些单词。(对于不替换
variable_list
为数组的解决方案,请参阅此答案的最后。)相反,使用适当的数组:
使用数组可确保您可以将每个单独的变量集作为其自己的数组条目来访问,而无需依赖换行符或其他字符分隔它们。
该代码还使用“here-strings”
bash
将字符串发送到cut
(而不是echo
管道)。或者,更有效地,
设置
IFS
为冒号read
会read
在冒号(而不是空格、制表符和换行符)上拆分输入。请注意,上面的所有引用都很重要。如果没有双引号,shell 将对 的值和三个变量执行分词和文件名
variable_list
通var
配c
。有关的:
如果您所追求的只是那个特定的输出,那么您可能会作弊:
这会
printf
在子 shell 中运行,因此设置IFS
和-f
(noglob
) shell 选项不会影响脚本的其余部分。在此处设置IFS
为冒号将使 shell 将不带引号variable_list
的数组扩展为三组三个参数printf
。printf
将根据其格式字符串打印前三个,然后为下一组三个参数重用该格式,直到所有参数都已处理。如果其中有任何文件名通配符,则可以
set -f
防止未引用的扩展触发文件名通配符。variable_list
使用换行符分隔的字符串:
这从字符串中读取数据,就好像它来自文件一样。
有关的:
您可以使用 awk 获取输出: