On Fri, 10 Nov 2023 at 15:17, Mikael Magnusson wrote: > On 11/10/23, Roman Perepelitsa wrote: > > On Fri, Nov 10, 2023 at 12:17 AM Jim wrote: > >> > >> Hi everyone, > >> > >> Using scripts, looking to cleanup duplicate files even if named > >> differently. > >> The issue I ran into is when a file path contains parentheses. '(' or > ')' > >> > >> Example File Name: Wallpapers/Web_downloads/05 (1).jpg > >> > >> The following is part of an anonymous function: > >> > >> local E > >> local -a AllFileNames > >> local -A FileNameCkSum > >> ... > >> for E (${(@)AllFileNames}) { > >> [[ -v FileNameCkSum[$E] ]] || FileNameCkSum[$E]=${$(shasum -a 1 $E)[1]} > } > >> # line that fails > >> ... > >> > >> AllFileName contains the result of a glob statement. > >> > >> Error Message: (anon):: invalid subscript > > > > Associative arrays in zsh are finicky when it comes to the content of > > their keys. The problem you are experiencing can be distilled to this: > > > > % typeset -A dict > > % key='(' > > % [[ -v dict[$key] ]] > > zsh: invalid subscript > > > > There is no simple quoting that you can apply to $key here: (q), (b), > > etc. are all wrong. You could perhaps escape a specific list of > > characters ('(', '[', '{' but not '$' or '*') although my memory tells > > me that some keys cannot be made to work under `[[ -v ...]]` or > > `unset` no matter how you try to escape them. I could be wrong though. > > Not sure why I didn't get this error when testing yesterday, but in > this case you can also avoid it by using the more typical (( > $+dict[$key] )) test instead of [[ -v ...]]. Indeed. The two capricious constructs I know of that dislike weird keys are `[[ -v ... ]]` and `unset ...`. Roman.