我编写了一个非常小的基本脚本,它比较了两个文件并将所有匹配的行写入文件。
我现在想要保证,无论您从哪个目录/工作目录运行bash脚本,该文件都存储在脚本所在的目录中。
#! /bin/bash
typeset -i count=1
typeset -i useable_counter=1
file="Fundstellen.txt"
curDir=`pwd`
wantedDir="/Users/Stephan/Documents/Schule/SYT/Skripting/bin/Uebungen"
echo `pushd ${wantedDir}`
if [ -e $file ]; then
echo `chmod 777 ${file}`
echo `rm ${file}`
fi
echo `touch ${file}`
while read pass; do
pass_nr=`echo $pass | cut -d ":" -f 3`
while read groups; do
group_nr=`echo $groups | cut -d ":" -f 3`
if [ "$pass_nr" = "$group_nr" ]; then
if [ $count -gt 15 ]; then
echo "#$useable_counter: $pass in $groups" >> $file
useable_counter=$useable_counter+1
fi
count=$count+1
fi
done < /etc/group
done < /etc/passwd
echo `chmod 444 $file`
echo `popd`
echo "Writing done!"
我的脚本使用pushd命令进入脚本所在的目录并弹出应返回。
但是,输出文件仍然是在启动脚本的目录/ working目录中创建的。
我需要改变什么以便它能够工作?我已经尝试使用普通cd
来更改目录,这就是变量curDir
存储起始目录的原因。
答案 0 :(得分:2)
通过将pushd
放入反引号中,您将在子shell中运行它。没有子shell可以更改其父shell的当前工作目录。
致电
pushd "$wantedDir"
直接,与popd
相同。
答案 1 :(得分:2)
你的剧本无可救药。在命名文件中生成输出所需的只是
command >/Users/Stephan/Documents/Schule/SYT/Skripting/bin/Uebungen/Fundstellen.txt
通常,极少数脚本需要明确cd
,而更少需要pushd
和popd
- 这些命令几乎完全用于交互式使用。
您为group
文件中的每个条目读取所有passwd
文件的循环效率极低,尤其是当内循环的目的似乎只是找到一小部分时,文件中的记录。通常,当您看到while read
时,您需要使用Awk。这是一个简单的框架。
awk -F : 'NR==FNR { ++p[$3]; next }
FNR > 15 && $3 in p { print "#" ++i ": " $3 " in " $0 }' /etc/passdwd /etc/group
目前还不清楚15应该完成什么。它是您脚本中的错误,还是仅在第一次迭代时跳过前15行?