Hi..
im a newbie in shell scripting, and also new in this forum..
i understand the command below is just reading from /etc/passwd
and getting whatever in field 1 and 3 (which are username and userID)

after the cut the format will be
username:uid
my guess,its making the array with the index in respect to its userID

but i dont understand the expression
{i#*:}]=${i%: *}
could somebody please explain how to read those...
and what those will evaluate to...
and how to work with things like those(i dont think those're regex-i have no clue)..

=========================================================
for i in $(cut -f 1,3 -d: /etc/passwd) ; do array[${i#*:}]=${i%: *}done

Recommended Answers

All 2 Replies

for i in $(cut -f 1,3 -d: /etc/passwd)  
do 
  echo "${i#*:}" "${i%:*}" 
done

This lets you see what is going on.

${i#*:}

is parameter substitution- returns the value just before the colon - a number that is the user id.

${i%:*}

returns the username, so:
arr[number] = name

${i%:*}

was changed from

${i%: *}

which doesn't work, by the way.
Try man (or info) for bash or ksh. This is called parameter substitution using a POSIX shell. It finds substrings.

bash's parameter substitution is a good feature to have, but it has ugly syntax. for what you want to do, you can use awk

awk -F":" '{print $3,$1}' /etc/passwd
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.