gpt4 book ai didi

linux - 如何在 sh 中使用 "and"执行 if 语句

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:36 25 4
gpt4 key购买 nike

我尝试用 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 '^(\-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

我也用这个括号尝试了许多不同的组合,但没有一个对我有用。也许有人可以在这里帮助我 :)

最佳答案

命令之间的逻辑和是&&

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

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

set -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

关于linux - 如何在 sh 中使用 "and"执行 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44569075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com