![]() |
'for' loop in bash script
Dear experts,
I am writing a bash script. At some point of the program I need to have 'for' loop. For simplicity I tried with some other simple code. The format of the loop is given below. Code:
k=51 Basically I want the k and m to variable. Can anyone address some point here? Appreciate any help in advance. Thanks |
This is because brace expansion is performed before variable expansion, so that the string inside the braces is interpreted literally as
Code:
51..55In your case better to use the seq command: Code:
for j in $(seq $k $m)Code:
for (( j=$k; j<=$m; j++ )) |
this is the line with the issue:
Code:
for j in {$k..$m};doThis works: Code:
for j in {1..5} |
sigh....while I founder, an expert answers.....;)
|
Two of the best pages to look at first when you come across scripting problems are the Bash Pitfalls and FAQ pages.
http://mywiki.wooledge.org/BashPitfalls http://mywiki.wooledge.org/BashFAQ In this case the problem is described in pitfall #33. Doing your counting with a c-style loop is usually more efficient and less prone to error anyway. Read the excellent Bash Guide from the same source for a good tutorial on scripting basics. http://mywiki.wooledge.org/BashGuide Edit: BTW, when operating in arithmetic contexts, variables don't usually need to be prefixed with "$". Since string literals are invalid, they are automatically assumed to be variables and expanded. Code:
w=$(( j+2 )) |
May I add, that similar I had done with WHILE loop
Code:
# number of drives |
@lithos:
Seems a bit overly-complex and wasteful to me; it does exactly the same thing as c-style for loop, only less cleanly and concisely. Also, "$[..]" is non-standard and deprecated. Use "((..))" instead, or "$((..))" if you need posix compatibility. You can also use the let keyword. Code:
(( i++ )) #bash or ksh form; uses ++ for simple value incrementing.1) Clean, consistent formatting makes code readable and more easily debuggable. Indent all your sub-commands, and separate logical sections with whitespace. Add comments anywhere the code isn't completely obvious (and remember, what seems obvious to you now will not be so a year or so down the line). Many people also feel that it's more readable to place the "do/then" keywords on the same line as the "for/while/until/if" keywords, as it more clearly separates the outside block from the inside block. Code:
for var in fee fai foo fum ; doWhen using bash or ksh, it's recommended to use ((..)) for numerical tests, and [[..]] for string/file tests and other complex expressions. Avoid using the old [..] test unless you specifically need POSIX-style portability. http://mywiki.wooledge.org/ArithmeticExpression http://mywiki.wooledge.org/BashFAQ/031 http://wiki.bash-hackers.org/commands/classictest http://wiki.bash-hackers.org/syntax/...nal_expression 3) QUOTE ALL OF YOUR VARIABLE SUBSTITUTIONS! You should never leave the quotes off a parameter expansion unless you explicitly want the resulting string to be word-split by the shell (globbing patterns are also expanded). This is a vitally important concept in scripting, so train yourself to do it correctly now. http://mywiki.wooledge.org/Arguments http://mywiki.wooledge.org/WordSplitting http://mywiki.wooledge.org/Quotes 4) Since environment variables are generally all upper-case, it's good practice to keep your own user variables in lower-case or mixed-case, to help differentiate them. It would probably also be more efficient to save the first grep output into an array first, so that you only have to run it once. Then you could check that as needed for the values you want. I don't know what the contents of the $CHECKfile looks like, though, or else I could post an updated version. |
| All times are GMT -5. The time now is 01:51 AM. |