From owner-freebsd-questions@FreeBSD.ORG Mon Aug 25 16:14:32 2008 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C41E61065687 for ; Mon, 25 Aug 2008 16:14:32 +0000 (UTC) (envelope-from barry.byrne@wbtsystems.com) Received: from hermes.wbtsystems.com (hermes.wbtsystems.com [193.120.231.28]) by mx1.freebsd.org (Postfix) with ESMTP id 4E6C58FC19 for ; Mon, 25 Aug 2008 16:14:32 +0000 (UTC) (envelope-from barry.byrne@wbtsystems.com) Received: from SUNYA (sunya.wbt.wbtsystems.com [10.12.1.114]) by hermes.wbtsystems.com (Postfix) with ESMTPA id B69CAF7413; Mon, 25 Aug 2008 17:14:28 +0100 (IST) From: "Barry Byrne" To: References: <01c301c906a9$57f7d830$72010c0a@wbt.wbtsystems.com> <272704.36116.qm@web57001.mail.re3.yahoo.com> Date: Mon, 25 Aug 2008 17:14:29 +0100 Message-ID: <035a01c906cd$a6d1a7f0$72010c0a@wbt.wbtsystems.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 11 Thread-Index: AckGvHrDjzubqffzQ26+7XBiem7ENQABqfEw X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3350 In-Reply-To: <272704.36116.qm@web57001.mail.re3.yahoo.com> Cc: freebsd-questions@freebsd.org Subject: RE: string split, bash and IFS X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Aug 2008 16:14:32 -0000 > -----Original Message----- > From: owner-freebsd-questions@freebsd.org > [mailto:owner-freebsd-questions@freebsd.org] On Behalf Of Unga > Sent: 25 August 2008 15:11 > To: Barry Byrne > Cc: freebsd-questions@freebsd.org > Subject: RE: string split, bash and IFS > > --- On Mon, 8/25/08, Barry Byrne wrote: > > > From: Barry Byrne > > Subject: RE: string split, bash and IFS > > To: unga888@yahoo.com, freebsd-questions@freebsd.org > > Date: Monday, August 25, 2008, 7:54 PM > > > -----Original Message----- > > > From: owner-freebsd-questions@freebsd.org > > > [mailto:owner-freebsd-questions@freebsd.org] On Behalf > > Of Unga > > > Sent: 25 August 2008 10:40 > > > To: freebsd-questions@freebsd.org > > > Subject: string split, bash and IFS > > > > > How to use bash and IFS to split a string? > > > > > > eg. > > > $string = "Name:Surname:10" > > > IFS=: > > > echo "$string" | read name surname age > > > > > > This does not work for some reason. The read does not > > create > > > name, surname and age variables. Any idea why? > > > > > > Appreciate your reply. > > d-questions-unsubscribe@freebsd.org" > > > > Unga: > > > > I think your problem is that each element of the pipeline > > runs in a separate > > process, so has no access to the variables from other > > processes. You could > > try something like: > > > > echo "Name:Surname:10" | ( IFS=: ; read name > > surname age ; echo $surname) > > > > Thanks for the reply. Your statement prints the Surname but > the variable $surname disappear after that and not available > for further processing. > > I'm referring to two sources for this: > 1. Learning the bash shell, 2nd Edition. O'Reilly publishers > Where on page 170, under read section > The basic syntax is: > read var1 var2... > > This statement takes a line from the standard input and > breaks it down into words delimited by any of the characters > in the value of the environment variable IFS. The words are > assigned to variables var1, var2, etc. > > 2. > http://www.unix.com/shell-programming-scripting/29202-perl-lik > e-split-function-bash.html > > It looks like it works for others but here on FreeBSD 7.0, > bash 3.2.33(0)-release, I find it difficult to get this > syntax to work. Unga: The variables in the read command are only available in the same shell process as the read command. In my example, that would be the commands within the () brackets, as the () cause a subshell to be spawned. In the most common situation, a read command is going to be part of a shell script, so the variables will be available within the script. Most often, a read command is going to read from standard input, so you'll have something like: --------------------- myscript.sh -------------------------- #!/usr/local/bin/bash IFS=: while read var1 var2 var3; do echo "The values are $var1, $var2 and $var3" done --------------------- myscript.sh -------------------------- Then call the script: echo "apple:orange:banana" | ./myscript.sh Or, maybe use the values from a file. ./myscript.sh < mylist.txt where mylist.txt contains one or more lines ------------------ mylist.txt ------------------ apple:banana:orange aea:coffee:milk green:blue:red ------------------ mylist.txt ------------------ - Barry