我有两个问题。让我们谈一谈简单的1st,然后再讨论case语句。
认为这很简单

if  fgrep -q '= ' sf
then
echo "blanks in file"
else
echo "no blanks"
fi

[[ `fgrep -q '= ' sf` ]]  && echo "blanks there"
# rc=$?
# echo "rc is $rc"


if条件的作用就像一个魅力。我正在尝试使用[[测试条件重写相同的内容,但它无法正常工作。我的测试条件出了什么问题。

现在第二个问题

实际上,这就是我想要做的。

我有这样的案例陈述

    source "/path"
    # die is a function that will output standard error and return 1
    opta=false
    optb=false

while getopts ":abf:" opt; do
  case $opt in
      a ) $optb && die "Cannot specify option a after specifying option b"
          opta=true
          ;;
      b ) $opta && die "Cannot specify option b after specifying option a"
          optb=true
          ;;
      f) # Pl see the note below for f

      \?) die "Invalid option: -$OPTARG. Abort"
          ;;
  esac
done
shift $(($OPTIND - 1))
test $# -eq 0 && die "You must supply SID"
test $# -eq 1 || die "Too many command-line arguments"
SID=$1


f是文件选项。因此,如果使用-f,则前两个不兼容。

myshell -f /path/file1 -a 500


以上是不允许的。我可以管理这部分,所以不必太担心

这是使我绊倒的岩石。
-f接受文件路径。该文件是一个手动覆盖文件,其中包含各种参数,这些参数将覆盖使用source命令设置的参数。因此,当涉及到f选项时,应执行以下操作
检查是否


文件路径有效
2。


如果有效,请检查是否存在“ =”即。等于后跟空格,然后退出。换句话说,我不要空格||那些空白

3

如果这两个条件都满足,则如果在文件中设置了搜索字符串的参数,则不会有任何位置参数传递给命令。

例如下面的手动覆盖文件

p1=v1
p2=v2
s=v3
p3=


     # some parameters like p3 need to be set in that case it will take the defaults from   the source file  if those aren't set


换句话说,例如下面的命令

myshell.ksh -f /路径/文件1500

如果未在file1中设置s的值,则该参数有效,否则应退出,并给出一个错误,即在文件-f file1中已应用覆盖值时提供了位置参数

4
导出在file1中设置的所有参数作为对源文件参数的替代。
例如源文件有

  p1=sv1


并在文件1中设置了p1,然后从文件1中导出p1 = v1

我可以管理#4。我只需要了解最多3美元即可。 2,1和4不会造成伤害

最佳答案

问题1

[[...]]那里没有生意。采用:

fgrep -q '= ' sf && echo "blanks there"


上面在fgrep上运行sf。如果fgrep指示成功,则运行echo命令。

问题2

如果/path/file1包含s变量的设置,并且命令行上有位置参数,那么我们应该报告一个错误:

grep '^s=' /path/file1 && [ "$#" -gt 0 ] && echo "ERROR: file has s parameter set and there are positional arguments"


上面检查了两个条件是否为真,如果两个条件都为真,则会打印一条错误消息。第一个条件是:

grep '^s=' /path/file1


如果文件/path/file1的行以字符s=开头,则为true。 (^表示行的开头。)第二个条件是:

[ "$#" -gt 0 ]


如果位置参数的数量大于零,则返回true。如果这两个条件都成立,则执行上述echo语句。

问题2:替代方法

在这种情况下,我们假设变量$filepath具有文件的路径和名称,例如/path/file1,其中包含用于设置变量的shell命令。以下内容检查该文件是否可读。如果是,那么它将在该文件中获取所有命令。下一行检查是否已设置s。如果有并且仍然有位置参数,那么它将显示一条消息:

[ -r "$filepath" ] && source "$filepath" # Set all override variables
[ -n "$s" ] && [ "$#" -gt 0 ] && echo "message"


在测试([...])语句中,请注意$filepath$s用双引号引起来。这样可以防止在任何一个值为空时出错。如果filepath的值包含空格,它还可以防止错误。

要获取文件,它不仅需要存在而且还需要可读。因此,上面的第一个测试将检查可读性(-r)而不是仅仅存在的(-f)。

更多

要检查源文件中是否有未注释的行,且变量设置为空值:

grep -qE '^[^#]+=$' file1 && echo "message"


在上面的^匹配行的开头。

正则表达式之所以有效,是因为[^#]与任何不是井号的字符匹配。由于加号表示一个或多个前面的字符,因此[^#]+表示一个包含一个或多个字符的字符串,都不是哈希符号。在方括号之外,^匹配行的开头。因此,^[^#]+匹配从行首开始的任何非哈希字符字符串。如果这些字符后跟等号,则^[^#]+=匹配。由于$与行的末尾匹配,因此^[^#]+=$如果该行以一个或多个非哈希字符开头,后跟等号,后跟无字符(该行的末尾),则匹配。因此,如果某个变量的值设置为no,则它匹配。

关于shell - shell 中的方括号(测试条件)内容和事例说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21873888/

10-10 03:21