在bash中运行循环

时间:2016-05-19 17:43:42

标签: bash for-loop

我试图让以下内容从“用户”中获取用户名'标识文件并为每一行(cd~ $ user)检查.subscriptions文件,如果存在,则将该输出减少到数据下的文件中。

 #!/bin/bash
  2 
  3 
  4 
  5 data=/usr2/c/subscription/userdata
  6 users=`cat /usr2/c/subscription/users`
  7 
  8 for i in $users
  9 do
 10 cd ~$i
 11 if 
 12         (test .subscriptions)
 13 then
 14         less .subscriptions >> $data
 15 else 
 16         echo "didn't run"
 17 fi
 18 done

2 个答案:

答案 0 :(得分:0)

你想要的可能是:

#!/bin/bash

#Note: using common directory saves me characters later!
usrDir=/usr2/c/subscription;
datFl=${usrDir}/userdata

#No need to read to variable just use subshell for loop input.
for u in $( cat ${usrDir}/users ); do
   subFl=~${u}/.subscriptions
   if [ -a $subFl ]; then
      cat $subFl >> $datFl
   else 
      echo "didn't run"
   fi
done
  1. 请注意,其他人指出,test不是您想要的命令 检查文件。您可以使用test -e,但[ -a $flName ]BASH的首选语法。

  2. 您可能不想使用less ...互动命令 ~{u}/.subscriptions... you probably want cat`。

  3. 没必要 cd~${u}目录。
  4. 另外,如果由于某种原因你扩展了代码,将users存储为数组变量是有意义的,你的语法有点偏。在这种情况下,您将使用:

    #!/bin/bash
    usrDir=/usr2/c/subscription;
    datFl=${usrDir}/userdata
    users=( $( cat ${usrDir}/users ) )
    for u in ${users[@]}; do
       ...
    done
    

    外部()对应于数组赋值。即分配一个字符串文字数组,你可以做

    users=( jim bob jones )
    

    在我的解决方案中也使用的内部$()是子shell。

    见(Advanced Bash-Scripting Guide):
    7.2. File test operators
    Chapter 21. Subshells
    Chapter 27. Arrays

    如何正确使用test
    The classic test command

答案 1 :(得分:0)

快速&安培;脏

#!/bin/bash
homedir() { $SHELL -c "cd ~$1 && pwd" 2>/dev/null; }
file=.subscriptions
while read -r user
do
        hd=$(homedir $user)
        [[ -z "$hd" ]] && continue;
        [[ -f "$hd/$file" ]] || continue
        cat "$hd/$file"
done

将其用作

this_script.sh < list_of_users.txt > output_file.txt