方括号 ( 测试条件 ) 外壳中的东西和预先案例陈述



我有两个问题。让我们先谈谈更简单的,然后我们将讨论案例陈述。 考虑这个简单,否则

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选项时,它应该执行以下操作 检查是否

  1. 文件路径有效

  2. 2.

如果有效,请检查是否有"="即等于后跟空白-然后退出。换句话说,我不想要空白值||那些 ^空白

3

如果同时满足这两个条件,则如果在文件中设置了搜索字符串 s 参数,则不能将任何位置参数传递给命令。

例如 以下手动覆盖文件

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/path/file1 500

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

四 将 File1 中设置的所有参数作为替代导出到源文件参数。 例如,源文件有

p1=sv1

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

我可以管理#4。我只需要对 3 美元有一些了解。2,1和4不会伤害

问题 1

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

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

以上运行fgrepsf. 如果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"

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

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

最新更新