-b在bash shebang中做什么?


32

我有以下bash脚本:

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi

没有-e,该脚本将无法运行。什么是-e这个脚本呢?另外,$?在这种情况下该怎么办?


1
奇。-e手册页中没有(我真的很想看到一个答案地址)。$?包含最后一个退出代码(egrep上面产生的过程的退出代码)。

2
@pst:-e记录在下set
Greg Hewgill 2011年

您可以通过执行以下操作来简化脚本:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan 2011年

2
您在if和之间缺少空格[。该脚本无法使用 -e,因为如果grep找不到任何内容,则-e该脚本将在此终止。如果不使用-e,则会向后显示消息:状态($?)为0表示grep确实找到了用户。注意,顺便说一句,它应该是`grep'^ username:'(如果还有另一个用户具有更长的名字呢?)。
吉尔(Gilles)“所以,别再邪恶了”,

3
#/bin/bash -e具有与#/bin/bash第1 set -e行和第2 行相同的效果?
blong

Answers:


34

错误退出。更多标志

如果有错误,它将立即退出。

$?是过去命令的退出状态。在Linux中,退出状态为0表示命令成功。任何其他状态都意味着发生错误。

egrep“ ^ username” / etc / passwd> / dev / null将在/ etc / passwd文件下查找用户名。如果找到它,则退出状态$?将等于0。如果找不到它,则退出状态将是其他值(不是0),因此您将“不存在回声”。


另外,您可以通过将前两行替换为来使脚本在没有-e的情况下正常运行if egrep "^username" /etc/passwd >/dev/null

1
为什么没有set要求?:-/

1
@pst:因为-ebash是作为命令行参数提供给bash的。setbash在其命令行中也接受下面列出的所有选项–请注意手册页“ 选项 ” 部分中的第一句话。
grawity

14

所有的bash命令行开关都记录在中man bash

      -e如果管道(可能包含一个
              单个简单命令),包含在其中的subshel​​l命令
              括号,或作为其中一部分执行的命令之一
              用大括号括起来的命令列表(请参阅SHELL GRAMMAR
              以上)以非零状态退出。外壳不
              如果失败的命令是该命令的一部分,则退出
              在一段时间或直到关键字之后立即列出,
              保留if或elif之后的部分测试
              单词,在&&或||中执行的任何命令的一部分 清单
              除最后一个&&或||之后的命令外,任何
              管道中的命令,但最后一个命令,或者命令的
              返回值用!反转。ERR上的陷阱
              如果设置,则在外壳退出之前执行。这个选项
              适用于外壳环境和每个子外壳环境
              单独安装(请参阅命令执行环境
              以上),并可能导致子shell在执行前退出
              子外壳中的所有命令。

2
啊 我在那个人中寻找它,但是在文件测试中找到-e却在主要参数下没有找到-e之后,我放弃了。不错的摘录。为什么没有set要求?:-/

1

您的脚本不正确,因为

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  #echo "doesn't exist" # WRONG
  echo "the USER EXISTS"
fi

退出状态0-均值-一切正常,在grep情况下表示“确定,找到了字符串”。退出状态!= 0表示有问题,对于grep而言1表示“未找到”,2表示“无法打开输入” ...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.