【问题标题】:running for loop in bash [closed]在bash中运行for循环[关闭]
【发布时间】:2016-05-19 17:43:41
【问题描述】:

我正在尝试获取以下内容,以从识别的“用户”文件中获取用户名,并为每一行 (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

【问题讨论】:

  • (test .subscriptions) 总是会返回 true -- 它查看 .subscriptions 是否为非空字符串,而不是查看该名称下的文件是否存在。
  • 您似乎忘记在问题中包含问题。
  • less 是一个向用户展示数据的工具,而不是......你想让它在这里做什么。
  • ...所以,我认为您应该单独提出一堆不同的问题(如果在知识库的其他地方还没有提出和回答这些问题)。其中之一是如何在 bash 中查找命名用户的主目录。
  • 请更新您的问题,使其真正提出问题。

标签: bash for-loop


【解决方案1】:

又快又脏

#!/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

【讨论】:

    【解决方案2】:

    可能你想要的是:

    #!/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 wantcat`。

    3. 没有必要 cd~${u} 目录。

    此外,如果由于某种原因您扩展了代码并且将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

    【讨论】:

    • 感谢您提供的信息!你们太棒了!我是新手,来自这个网站和网络的指针非常棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多