我有两个问题。让我们谈一谈简单的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/