bash - All files in one dir, linux -
today tried script in linux files in 1 dir. pretty straightforward, found interesting.
#!/bin/bash inputdir=/home/xxx/ file in $inputdir'*' echo $file done the output is:
/home/xxx/filea /home/xxx/fileb but when input dir directly, like:
#!/bin/bash inputdir=/home/xxx/ file in /home/xxx/* echo $file done the output is:
/home/xxx/filea /home/xxx/fileb it seems, in first script, there 1 loop , file names stored in variable $file in first loop, separated space. in second script, 1 file name stored in $file in 1 loop, , there more 1 loop. difference between these 2 scripts?
thanks much, maybe question little bit naive..
the behavior correct , "as expected".
for file in $inputdir'*' means assign "/home/xxx/*" $file (note quotes). since quoted asterisk, not executed @ time. when shell sees echo $file, first expands variables , glob expansion. after first step, sees
echo /home/xxx/* and after glob expansion, sees:
echo /home/xxx/filea /home/xxx/fileb only now, execute command.
in second case, pattern /home/xxx/* expanded before for executed , thus, each file in directory assigned file , body of loop executed.
this work:
for file in "$inputdir"* but it's brittle; fail, example, when forget add / end of variable $inputdir.
for file in "$inputdir"/* is little bit better (unix ignore double slashes in path) can cause trouble when $inputdir not set or empty: you'll list files in / (root) folder. can happen, example, because of typo:
inputdir=... file in "$inputdir"/* case matters on unix :-)
to understand code this, use set -x ("enable tracing") in line before code want debug.
Comments
Post a Comment