Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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/17.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 如何在sh中使用带有“and”的if语句_Linux_Bash_Unix_If Statement_Sh - Fatal编程技术网

Linux 如何在sh中使用带有“and”的if语句

Linux 如何在sh中使用带有“and”的if语句,linux,bash,unix,if-statement,sh,Linux,Bash,Unix,If Statement,Sh,我试图用sh而不是bash来解决这个问题。 我只需要一个if语句来检查一些正则表达式和其他东西。通常在bash中,这将是一项简单的工作,但在sh中,我只能在网上找到不适合我的解决方案 我想检查的第一件事是: if echo "$1"| grep -E -q '^(\-t|\-\-test)$'; if echo "$#"| grep -E -q '^(1|2)$'; 我想检查一下: if echo "$1"| grep -E -q '^(\-t|\-\-test)$'; if echo

我试图用sh而不是bash来解决这个问题。 我只需要一个if语句来检查一些正则表达式和其他东西。通常在bash中,这将是一项简单的工作,但在sh中,我只能在网上找到不适合我的解决方案

我想检查的第一件事是:

if echo "$1"| grep -E -q '^(\-t|\-\-test)$'; 
if echo "$#"| grep -E -q '^(1|2)$';
我想检查一下:

if echo "$1"| grep -E -q '^(\-t|\-\-test)$'; 
if echo "$#"| grep -E -q '^(1|2)$';
合并:

if [ \(echo "$1"| grep -E -q '^(\-h|\-\-help)$'\) -a \(echo "$#"| grep -E -q '^(1|\2)$'\) ];
错误:

grep: grep: ./analysehtml.sh: 41: [: missing ]
Invalid back reference
(echo: No such file or directory
grep: 1: No such file or directory

我也尝试了许多不同的括号组合,但没有一个适合我。也许有人可以帮我:

命令之间的逻辑and是&&

默认情况下,管道的退出状态为最后一个命令的退出状态

设置-o pipefail如果管道的任何命令具有失败退出状态,则退出状态为失败

当仅必须检查序列最后一个命令的退出状态时

if { command11; command12;} && { command21; command22;};
但是,要检查参数,不需要使用管道启动另一个进程grep,这会带来开销

考虑将以下构造用于任何POSIX sh

if { [ "$1" = -h ] || [ "$1" = --help ];} &&
    { [ $# -eq 1 ] || [ $# -eq 2  ];};
编辑:以下不是POSIX,但可以用于许多shell

if [[ $1 = -h || $1 = --help ]] && [[ $# = 1  || $# = 2 ]];

还可以与bash一起使用set-o posix

逻辑和命令间&&

默认情况下,管道的退出状态为最后一个命令的退出状态

设置-o pipefail如果管道的任何命令具有失败退出状态,则退出状态为失败

当仅必须检查序列最后一个命令的退出状态时

if { command11; command12;} && { command21; command22;};
但是,要检查参数,不需要使用管道启动另一个进程grep,这会带来开销

考虑将以下构造用于任何POSIX sh

if { [ "$1" = -h ] || [ "$1" = --help ];} &&
    { [ $# -eq 1 ] || [ $# -eq 2  ];};
编辑:以下不是POSIX,但可以用于许多shell

if [[ $1 = -h || $1 = --help ]] && [[ $# = 1  || $# = 2 ]];

使用set-o posix也可以与bash一起使用可能对于您的特定情况,模式匹配可能更好:

if [[ $1 =~ ^(\-h|\-\-help)$ && $# =~ ^(1|\2)$ ]]; then

对于您的特定情况,模式匹配可能更好:

if [[ $1 =~ ^(\-h|\-\-help)$ && $# =~ ^(1|\2)$ ]]; then

命令的问题在于test或[command]中的部分是表达式,而不是命令列表。 因此,当您运行[echo'hello']或[\echo'hello'\]时,不管sh或Bash如何,都会抱怨错误。请参阅经典测试用法:

if的语法是:

因此,您可以在if语句中将命令与&&运算符组合使用:

if echo "$1"| grep -E -q '^(\-h|\-\-help)$' && echo "$#"| grep -E -q '^(1|\2)$'; 

命令的问题在于test或[command]中的部分是表达式,而不是命令列表。 因此,当您运行[echo'hello']或[\echo'hello'\]时,不管sh或Bash如何,都会抱怨错误。请参阅经典测试用法:

if的语法是:

因此,您可以在if语句中将命令与&&运算符组合使用:

if echo "$1"| grep -E -q '^(\-h|\-\-help)$' && echo "$#"| grep -E -q '^(1|\2)$'; 

[[ ]]是一种bash主义吗?是bash采用的ksh主义吗?它在sh中不起作用,在标题中指定的shell中。标记中同时包含这两种内容是…不幸的。人们仍然使用sh?可能也使用FORTRAN66。很多人都使用sh。请参阅dash-Debian、Ubuntu等中的默认/bin/sh。任何人都在编写!/bin/sh,这是脚本中常见的shebang在其中一个平台上执行。基于Busybox的嵌入式平台也同样使用ash衍生产品,这是出于更合理的理由。也许你在想20世纪70年代的Bourne?在现代平台上,/bin/sh是POSIX sh-一种现代的、积极维护的标准,尽管不包括[[]].@Charles-你认为哪些原因比编写可移植代码更具说服力?[[]是一种bash主义吗?是bash采用的ksh主义吗?它在sh中不起作用,在标题中指定的shell中。标记中同时包含这两种内容是…不幸的。人们仍然使用sh?可能也使用FORTRAN66。很多人都使用sh。请参阅dash-Debian、Ubuntu等中的默认/bin/sh。任何人都在编写!/bin/sh,这是脚本中常见的shebang在其中一个平台上执行。基于Busybox的嵌入式平台也同样使用ash衍生产品,这是出于更合理的理由。也许你在想20世纪70年代的Bourne?在现代平台上,/bin/sh是POSIX sh-一种现代的、积极维护的标准,尽管不包括[[]]@Charles-你认为什么原因比编写可移植代码更具辩护力?sh或bash?两种不同的语言,并且你的答案并非都适用于这两种语言。与其使用grep检查$的值,不如使用test$-le 2btw,test-a不推荐使用-请参阅,特别是应用程序使用部分;注意另外,在本规范的其余部分中,OB标记代表obsolescent.sh或bash?两种不同的语言,并且并非所有答案都适用于这两种语言。与其使用grep检查$的值,不如使用test$-le 2btw,test-a不推荐使用-请参阅,特别是应用程序使用部分;另请注意,在sp的其余部分ec,OB标签代表过时。谢谢你,它真的起作用了。互联网让我发疯了。每个人都在说一些其他的话xD谢谢你,谢谢你,谢谢你。互联网让我发疯了。每个人都在说一些其他的话xD谢谢你不,[[]]没有
le在所有POSIX shell中-它是一个扩展,最初由ksh实现,后来被bash和其他人采用,但它不是基线规范的一部分,也不存在于ash、dash等中。如果您想要一个能够执行通配符匹配的与POSIX兼容的等价物,就像[[$1=-*]一样,这种情况是这样的:在-h |-help-echo-executing-help中的case$1;;esacIt不认为[[应该与任何POSIX sh一起使用。只是说[[和]]在某些实现中可能会被识别为保留字,因为没有引用任何字符,导致未指定的结果,并且至少有一个POSIX shell破折号不支持它们。@ruakk,indead我找不到[[在参考资料中,但是在bash-after-o posix中,它仍然可以工作:[[]]函数中,select可能会在某些情况下被识别为保留字implementations@NahuelFouilleul,bash的set-o posix绝对不是严格意义上的posix。事实上,除非还设置了xpg_echo选项,否则它甚至不符合posix。不,[[]并非在所有POSIX Shell中都可用-它是ksh首先实现的扩展,后来被bash和其他人采用,但它不是基线规范的一部分,也不存在于ash、dash等中。如果您想要一个能够执行通配符匹配的POSIX兼容等效程序,如[[$1=-*]]是的,就是这样的情况:在-h |-help echo执行help中的case$1;;esacIt不是真的[[应该与任何POSIX sh一起工作。只说[[和]]在某些实现中,当没有引用任何字符时,可能会被识别为保留字,从而导致未指定的结果,并且至少有一个POSIX shell破折号不支持这些字符。@ruakk,indead我在引用中找不到[[但是在bash中set-o POSIX之后它仍然有效:[]]功能,在某些情况下,select可能会被识别为保留字implementations@NahuelFouilleul事实上,除非同时设置了xpg_echo选项,否则它甚至都不符合posix。