Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在if语句中使用grep_Linux_Bash_Shell_If Statement_Grep - Fatal编程技术网

Linux 在if语句中使用grep

Linux 在if语句中使用grep,linux,bash,shell,if-statement,grep,Linux,Bash,Shell,If Statement,Grep,我的目标是编写一个shell脚本,将我已经筛选出的用户从文件中取出,检查这些用户是否有特定的字符串,如果有,则将其标记为主要,如果没有,则标记为非主要。我的问题来自于我的第一个if语句,我不确定grep是否是if语句的正确方式。以下是我所拥有的: ( while read i do username=`echo $i | grep -v 'CMPSC 1513' | grep -P -v '(?!.*CPSMA 2923)CPSMA' | cut -d'|' -f2` fullname=`

我的目标是编写一个shell脚本,将我已经筛选出的用户从文件中取出,检查这些用户是否有特定的字符串,如果有,则将其标记为主要,如果没有,则标记为非主要。我的问题来自于我的第一个if语句,我不确定grep是否是if语句的正确方式。以下是我所拥有的:

(
while read i
do


username=`echo $i | grep -v 'CMPSC 1513' | grep -P -v '(?!.*CPSMA 2923)CPSMA' | cut -d'|' -f2` 
fullname=`echo $i | grep -v 'CMPSC 1513' | grep -P -v '(?!.*CPSMA 2923)CPSMA' | cut -d'|' -f3`
id=`echo $i | grep -v 'CMPSC 1513' | grep -P -v '(?!.*CPSMA 2923)CPSMA' | cut -d'|' -f4`

if [ $username ]
then

if grep -q "|0510"
then 
    echo $username":(password):(UID):(GID):"$fullname"+"$id":/home/STUDENTS/majors:/bin/bash"
else 
    echo $username":(password):(UID):(GID):"$fullname"+"$id":/home/STUDENTS/nonmajors:/bin/bash"
fi      
fi

done
)<./cs_roster.txt
(
当我读书的时候
做
用户名=`echo$i | grep-v'CMPSC 1513'| grep-P-v'(?!*CPSMA 2923)CPSMA'| cut-d'|'-f2`
全名=`echo$i | grep-v'CMPSC 1513'| grep-P-v'(?!*CPSMA 2923)CPSMA'| cut-d'|'-f3`
id=`echo$i | grep-v'CMPSC 1513'| grep-P-v'(?!*CPSMA 2923)CPSMA'| cut-d'|'-f4`
如果[$username]
然后
如果grep-q“| 0510”
然后
echo$username:(密码):(UID):(GID):“$fullname”+“$id”:/home/STUDENTS/majors:/bin/bash”
其他的
echo$username:(密码):(UID):(GID):“$fullname”+“$id”:/home/STUDENTS/nonmajors:/bin/bash”
fi
fi
完成

) 只需删除方括号并将
$i
传递给
grep

if echo $i | grep -q "|0510"
在您的代码示例中,
grep
没有任何需要处理的内容。

出现“预期的二进制运算符”是因为您正在调用带有参数“grep”和“-q”(您根本没有调用grep)的命令
[
并且在指定了
-q
的地方需要一个二进制运算符
[
是一个命令,与
grep
ls
cat
没有区别。最好(IMO)拼写它
test
,当通过名称
test
调用时,它不要求最后一个参数是
]
。如果要在If语句中使用
grep
,只需执行以下操作:

if echo "$username" | grep -q "|0510"; then ...
(尽管我怀疑,根据具体情况,有更好的方法来实现您的目标。)


if语句的基本语法是
if管道;然后…
。在常见情况下,管道是简单的命令
test
,在历史之前的某个时刻,决定为
test
命令提供名称
[
,并附加警告,即其最终参数必须是
]
。我相信这样做是为了让if语句看起来更自然,就像
[
是语言中的运算符一样。忽略
[
并始终使用
测试
,可以避免很多混淆。

您可以将此代码用作练习。为其编写
awk
脚本,或者从类似的内容开始

while IFS='|' read -r f1 username fullname id otherfields; do
   # I don't know which field you want to test. I will rest with id
   if [[ $id =~ ^0510 ]]; then
      subdir=majors
   else
      subdir=nonmajors
   fi
   echo "${username}:(password):(UID):(GID):${fullname}+${id}:/home/STUDENTS/${subdir}:/bin/bash"
done < <( grep -v 'CMPSC 1513' ./cs_roster.txt | grep -P -v '(?!.*CPSMA 2923)CPSMA' )
当IFS='|'读取-r f1用户名全名id其他字段时;执行
#我不知道您要测试哪个字段。我将使用id休息
如果[[$id=~^0510]];则
细分=专业
其他的
细分=非主要
fi
echo“${username}:(password):(UID):(GID):${fullname}+${id}:/home/STUDENTS/${subdir}:/bin/bash”

done-q
开关正好启用您列出的有问题的行为:在第一次匹配时停止。我认为您应该澄清这个问题。您的目标是什么?数据看起来如何您需要使用正则表达式来捕获
|0510
魔术字符串和用户名,可能是
“$username.*0510
”。不确定这是否是您所需要的。好的,我可能看到了错误。除了
-q
开关和grep的字符串之外,您没有向grep传递任何内容。如果我们不需要猜测代码的其余部分是什么样子,如果您发布了一个完整的示例,允许人们帮助您,而不必尝试推断代码的结构,这将有所帮助您描述的其余代码的CTU。
[
不是一个操作符。这可能看起来像一个迂腐的观点,但它确实是造成混乱的核心原因。这是一个命令,就像
grep
谢谢你的回答。我确实理解测试命令,并且在我发布时括号运行了测试命令,但原始代码正是我所拥有的。我尝试了你的解决方案,我当只有一个应该是非主要的,其余的应该是主要的时,我重复了所有的非主要。如果你想看的话,我编辑了我的文章,包含了没有括号的完整代码。这是一个糟糕的编辑。
如果grep-q“| 0510”
正在从./cs_lotster.txt读取数据,并在while循环的情况下读取数据。我强烈建议您寻找
awk
解决方案,而不是尝试在while循环中执行此操作。Andrea的回答解决了我的问题,但感谢您对所有问题的解释。抱歉,我可能有点困惑。New to堆栈溢出,仍在尝试解决所有问题。