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