Bash拆分数组,添加一个变量并将其连接在一起

时间:2018-05-14 03:04:33

标签: linux bash

我一直试图解决这个问题,不幸的是我无法解决这个问题。我正在尝试创建一个能够找到&#39 ;;'字符,在它之前放置四个空格然后将代码放回到一个整齐的句子中。我已经解决了这个问题,并且无法弄清楚一些事情。我无法获得输出以显示我想要的内容。我试过找到&#39 ;;'性格,我似乎错误的方式。我似乎正在犯的另一个错误是我试图在for循环中拆分数组,然后逐字拆分数组中的单个单词,但我无法弄清楚如何做那个。如果有人能给我一个指针,我将不胜感激。这是在bash版本4.3.48

{{1}}

2 个答案:

答案 0 :(得分:0)

在stdin上使用模式替换制作一个小功能:

semicolon4s() { while read x; do echo "${x//;/    ;}"; done; }
semicolon4s <<< 'foo;bar;baz'

输出:

foo    ;bar    ;baz

答案 1 :(得分:0)

如果我理解你想要的东西,基本上每个前面放4个空格&#34 ;;&#34;在参数中,并打印结果。这在使用字符串替换的bash中实际上很简单:

commentPlacer() {
    echo "${1//;/    ;}"
}

此处的展开采用格式${variable//pattern/replacement},并提供变量的内容,每次pattern替换为replacement。请注意,在模式之前只有一个/,它只会替换第一次出现。

现在,我不确定我是否理解你的剧本应该如何运作,但是我发现有些事情显然没有做你期望他们做的事情。以下是我看到的问题的快速摘要:

arg=($1)   #argument

这不会从第一个参数创建一个字符数组。 var=(...)( )中的内容视为单词的列表,而不是字符。由于$1不是双引号,因此它会根据空格(通常为空格,制表符和换行符)拆分为单词,然后将展开包含通配符的任何单词到匹配文件名列表。我很确定这根本不是你想要的(事实上,它几乎不是你想要的,所以变量引用几乎总是双引号来防止它)。在bash中创建一个字符数组并不容易,而且通常不是你想要做的事情。您可以使用${var:index:1}访问字符串变量中的单个字符,其中index是您想要的字符(从0开始计算)。

 commaIndex=(${arg[@]#;})   #the attempted index look up

这不会进行查找。替换${var#pattern}给出var的值,其中pattern从前面删除(如果匹配)。如果有多个可能的匹配,则使用最短的匹配。变体${var##pattern}使用最长的匹配。使用${array[@]#pattern},它会尝试从每个元素中删除模式 - 并且由于它不是双引号,因此结果会像往常一样进行单词分割和通配符扩展。我很确定这根本不是你想要的。

if [[  ${arg[count1]} != commentSpace ]]  #if no commentSpace variable then

在这里(以及其他许多地方),您使用前面没有$的变量;这根本不使用变量,只是对待&#34; commentSpace&#34;作为静态字符串。此外,在一些地方,在它周围加上双引号是很重要的,例如:保持$commentSpace中的空格不会因分词而消失。有些地方可以安全地将双引号留下来,但一般来说,跟踪它们太难了,所以只需在任何地方使用双引号。

一般建议:不要尝试用bash编写c(或java或者其他)程序;它的工作方式有所不同,你必须以不同的方式思考。使用shellcheck.net来发现常见问题(例如非双引号变量引用)。最后,您可以通过将set -x放在不符合预期的部分之前来查看bash正在做什么;这将使bash在执行时打印每一行,显示相应的执行内容。