我有两个问题。让我们先谈谈更简单的,然后我们将讨论案例陈述。 考虑这个简单,否则
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
如果同时满足这两个条件,则如果在文件中设置了搜索字符串 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"
以上运行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"
在上面的^
匹配一行的开头。
正则表达式之所以有效[^#]
是因为它匹配任何不是哈希符号的字符。 由于加号表示前面的一个或多个字符,因此[^#]+
表示一个或多个字符的字符串,其中没有一个是哈希符号。 在方括号之外,^
与行首匹配。 因此,^[^#]+
匹配从行首开始的任何非哈希字符字符串。 如果这些字符后跟等号,则^[^#]+=
匹配。 由于$
与行尾匹配,因此如果该行以一个或多个非哈希字符开头,后跟等号,后跟任何内容(行尾),则^[^#]+=$
匹配。 因此,如果某个变量的值设置为无,则它匹配。