Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I have the following simple ksh code:

 MY_LIST=first,second,third
 NUM_IN_LIST=` echo $MY_LIST | sed s"/,/ /g" | wc -w `
 print $NUM_IN_LIST
 3
 [[ $NUM_IN_LIST = 3 ]] && print match

 but I dont get the match print -:(

maybe because some spaces?

can I get some other suggestion to count and print the words in $MY_LIST ? (after remove the "," seperator)

share|improve this question

2 Answers 2

up vote 0 down vote accepted

Your example works for me.

Here's an alternative:

MY_LIST=first,second,third
saveIFS=$IFS
IFS=','
array=($MY_LIST)
IFS=$saveIFS
NUM_IN_LIST=${#array[@]}
print $NUM_IN_LIST
[[ $NUM_IN_LIST = 3 ]] && print match
share|improve this answer
    
another example is to use the awk '{print NF}' to count the elements in MY_LIST –  jennifer Oct 5 '10 at 10:33
    
You need set -f before the unquoted $MY_LIST, in case the string contains globbing characters. But using IFS is more complicated that it needs to be in ksh. –  Gilles Oct 5 '10 at 21:40

Your code should work, but only if $MY_LIST doesn't contain any of various special characters:

  • echo $MY_LIST should be printf %s "$MY_LIST" or print -r -- "$MY_LIST". The lack of quotes tells the shell to expant globbing characters \\*?[. It also tells the shell to split words at spaces, although that wouldn't matter here except for the next problem.
  • Using echo additionally causes interpretation of backslashes and a leading - in some circumstances.
  • `sed s"/,/ /g" makes both commas and spaces word separators.

An additional issue, explaining why your final test doesn't work, is that wc -w produces output with leading spaces, which are captured in $NUM_IN_LIST. print $NUM_IN_LIST performs word splitting on $NUM_IN_LIST, so it ends up just printing the digits; do print "$NUM_IN_LIST" to see the difference. The [[ … ]] construct inhibits word splitting, and = is a string comparison operator, so you are correctly told that ' 3' is not the same thing as '3'. [[ $NUM_IN_LIST -eq 3 ]] or [ $NUM_IN_LIST = 3 ] would have been true (but neither is a real solution, they're just limited workarounds).


A pure ksh way to show the number of comma-separated fields is

commas=${MY_LIST//[!,]/}
NUM_IN_LIST=${#commas}

If anyone needs a POSIX sh solution, replace the first line by commas=$(printf %s "$MY_LIST" | tr -dc ,).

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.