我试图让以下内容从“用户”中获取用户名'标识文件并为每一行(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
答案 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
请注意,其他人指出,test
不是您想要的命令
检查文件。您可以使用test -e
,但[ -a $flName ]
是BASH
的首选语法。
您可能不想使用less
...互动命令
~{u}/.subscriptions... you probably want
cat`。
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
答案 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