gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:06 25 4
gpt4 key购买 nike

我一直在努力解决这个问题,不幸的是我做不到。我正在尝试创建一个函数来查找“;”字符,在它前面放四个空格,然后将代码放回一个整齐的句子中。我一直在努力解决这个问题,但无法弄清楚一些事情。我无法让输出显示我想要的内容。我试过找到 ';' 的索引性格,看来我走错了路。我似乎犯的另一个错误是我试图在 for 循环中拆分数组,然后按字母拆分数组中的各个单词,但我也不知道该怎么做。如果有人可以给我一个指针,将不胜感激。这是 bash 版本 4.3.48

#!commentPlacer() 
{

arg=($1) #argument
len=${#arg[@]} #length of the argument
comment=; #character to look for in second loop
commaIndex=(${arg[@]#;}) #the attempted index look up
commentSpace=" ;" #the variable being concatenated into the array

for(( count1=0; count1 <= ${#arg[@]}; count1++ )) #search the argument looking for comment space
do if [[ ${arg[count1]} != commentSpace ]] #if no commentSpace variable then
then for (( count2=0; count2 < ${#arg[count1]} ; count2++ )) #loop through again
do if [[ ${arg[count2]} != comment ]] #if no comment
then A=(${arg[@]:0:commaIndex})
A+=(commentSpace)
A+=(${arg[@]commaIndex:-1}) #concatenate array
echo "$A"
fi
done
fi
done

}

最佳答案

如果我理解正确的话,基本上是在每个“;”前放置 4 个空格。在参数中,并打印结果。这在 bash 中使用字符串替换实际上很简单:

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

此处的扩展格式为${variable//pattern/replacement},它给出了变量的内容,每次出现的pattern都被替换为替换。请注意,在模式前只有一个 /,它只会替换第一次出现的地方。

现在,我不确定我是否理解您的脚本应该如何工作,但我看到有几件事显然没有按照您的预期进行。以下是我遇到的问题的简要总结:

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

在这里(以及其他许多地方),您使用的变量前面没有 $;这根本不使用变量,它只是将“commentSpace”视为静态字符串。此外,在几个地方用双引号引起来很重要,例如以防止 $commentSpace 中的空格因分词而消失。有些地方可以安全地省略双引号,但通常很难跟踪它们,所以只需在所有地方使用双引号即可。

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

关于linux - Bash 拆分一个数组,添加一个变量并将其连接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50322613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com