On 2024-04-19 13:40, Lawrence Velázquez wrote: > On Fri, Apr 19, 2024, at 3:22 PM, Ray Andrews wrote: >> That's my preferred way to look at 'apt-file search' output (Debian and >> derivatives only of course). It works fine and I think I understand >> all the expansions and splitting. One you get used to it the nested >> expansions aren't so scary, just read them from inside out, one step at >> a time and it's easy. But is it optimal? > How is anyone supposed to answer this question, when you haven't > deigned to mention what your code is supposed to DO? I thought I was crystal clear what it is supposed to do: reformat 'apt-file search' output.  The code runs, if you have a Debian derivative fire it up. > You seem to > colorize certain portions of the output by bracketing them with > escape sequences, but which portions, exactly? What does > "apt-file search" typically output? I wasn't expecting anyone but Debian users to comment.  Unless there are issues that are apparent just from scanning the code. > You don't check the exit status of "apt-file", so if it happens to > fail for any reason It's taken care of, just not within that minimal code I showed. > ((i=1; i<=$#var; i++ )); do > Since you only ever use "i" in the expansion "${=var[i]}", there > is no reason to use this form of "for". You can just use the usual > > for x in "$var[@]"; do Ah!  Now there's a good idea.  I tend to use the above only on  the command line, and the more 'formal' for loop in code -- seems more like C. > and subsequently "$x" instead of "$var[i]". Right!  Simpler. >> if [[ "$targ" != "${${=var[i]}[1]}" ]]; then >> targ="${${=var[i]}[1]}" >> var2+="\n${grn}${${=var[i]}[1]}${nrm}" # Copy first word of >> line. > You're doing that thing again, where you use a literal backslash-n > and rely on "print" to interpret it as a newline. This is bad > practice here because the rest of the string is the arbitrary output > of an external command, which you do not control. It could easily > contain substrings that are meaningful to "print". I've come to appreciate the problem!  Now for healthy solutions. > To insert an empty line in your output, just add an empty element > to "var2" in the desired position. > > % var=(a) > % var+= > % var+=b > % typeset -p var > typeset -a var=( a '' b ) > % print -rC1 -- "$var[@]" Very good, I'll implement that. > You should store the result of "${=var[i]}" in a temporary variable > and use that, instead of repeatedly word-splitting the same string > over and over and over. Right.  Three uses, so a temporary var would earn it's keep. >> print -l "$var2[@]" > Use "print -r" to prevent "print" from interpreting escape sequences > in its arguments. ... and that meshes with getting rid of the '\n's, yes? Thanks.  It's the difference between something that merely works, with something that's genuinely well coded.