bash脚本的新手,所以只是想知道我是否正确地执行此代码。我试图搜索/ etc / passwd然后grep并打印用户。
usage ()
{
echo "usage: ./file.sk user"
}
# test if we have two arguments on the command line
if [ $# != 1 ]
then
usage
exit
fi
if [[ $# < 0 ]];then
usage
exit
fi
# Search for user
fullname=`grep $1 /etc/passwd | cut -f 5 -d :`
firstname=`grep $1 /etc/passwd | cut -f 5 -d : | cut -f 1 -d " "`
#check if there. if name is founf: print msg and line entry
not sure as how to this or if im doing this right...
我这样做对吗?
答案 0 :(得分:3)
grep $1 /etc/passwd | while IFS=: read -r username passwd uid gid info home shell do echo $username: $info done
答案 1 :(得分:2)
这可能对您有用:
fullname=$(awk -F: '/'$1'/{print $5}' /etc/passwd)
firstname=${fullname/ *}
答案 2 :(得分:1)
而不是:
fullname=`grep $1 /etc/passwd | cut -f 5 -d :`
firstname=`grep $1 /etc/passwd | cut -f 5 -d : | cut -f 1 -d " "`
试试这个:
fullname=$(cut -f5 -d: /etc/passwd | grep "$1")
if [[ $? -ne 0 ]]; then
# not found, do something
fi
firstname=${fullname%% *} # remove the space and everything after
请注意,我在grep之前更改了我的答案,以便在其他字段与您要搜索的全名匹配时不会出现误报。
答案 3 :(得分:1)
你走在正确的轨道上。
但我认为第二个if [[ $# < 0 ]] .... fi
块对你没有多大帮助。你的第一个测试用例得到了正确的情况,'这个脚本需要1个参数或退出'。
另外,我看不到你需要的名字,所以基本测试是
case "${fullname:--1}" in
-[1] ) printf "No userID found for input=$1\n" ; exit 1 ;;
* )
# assume it is OK
# do what every you want after this case block
;;
esac
当然,如果您真的需要检查,可以使用"${firstname}"
复制此内容。
如果...... fi是
,则作为等价物 if [[ "${fullname}" == "" ]] ; then
printf "No userID found for input=$1\n" ; exit 1
fi
注意为了提高效率,你可以解析$ {fullname}来获取firstname而不需要调用grep等,即
firstname=${fullname%% *}
如果您需要我解释一下,请告诉我: - 1}和%% *}变量修饰符。
我希望这会有所帮助。
答案 4 :(得分:0)
您只需阅读array
的输入,然后打印出所需的字段,就像这样 -
grep $1 /etc/passwd | while IFS=: read -a arry; do
echo ${arry[0]}:${arry[4]};
done
jaypal:~/Temp] echo "root:*:0:0:System Administrator:/var/root:/bin/sh" |
while IFS=: read -a arry; do
echo ${arry[0]}:${arry[4]};
done
root:System Administrator