Linux Shell脚本(如果未评估用户帮助信息显示的条件)
我已经编写了一个帮助菜单,作为有关shell脚本使用的参考Linux Shell脚本(如果未评估用户帮助信息显示的条件),linux,bash,shell,Linux,Bash,Shell,我已经编写了一个帮助菜单,作为有关shell脚本使用的参考my_script.sh echo $'\n\n' echo $(printf '=%.0s' {1..100}) printf ' %.0s' {1..40} echo "Welcome" echo $(printf '=%.0s' {1..100}) echo $'\n' arg=$1 echo "Input : $arg" echo if [[ arg -eq "-h" ]] || [[ arg -eq "-H" ]] || [
my_script.sh
echo $'\n\n'
echo $(printf '=%.0s' {1..100})
printf ' %.0s' {1..40}
echo "Welcome"
echo $(printf '=%.0s' {1..100})
echo $'\n'
arg=$1
echo "Input : $arg"
echo
if [[ arg -eq "-h" ]] || [[ arg -eq "-H" ]] || [[ arg -eq "-help" ]] || [[ arg -eq "-Help" ]] || [[ arg -eq "--h" ]] || [[ arg -eq "--H" ]] || [[ arg -eq "--help" ]] || [[ arg -eq "--Help" ]]; then
echo "Help menu requested...."
echo $'\n\n'
echo $(printf '~%.0s' {1..100})
printf ' %.0s' {1..43}
echo "Help Menu"
echo $(printf '~%.0s' {1..100})
echo $'\n'
exit 0
else
echo "Executing a program...."
./another_script.sh
fi
当我执行'myscript.sh-h'(或任何带有'-'前缀的选项)时,它会转到if条件,但任何其他参数都不会。我做错了什么?我不熟悉bash脚本。if的
有两个简单问题:
-eq
,=
或=
用于字符串
- 在
if
中使用$arg
(而不是arg
)
但是:我建议使用而不是字符串比较。这将使该部分更加健壮,可以考虑不同的参数顺序,或者将一个字母的参数组合到一个参数中。不幸的是,我不知道代码不起作用的确切原因,但我可以为您提供一个快速解决方案:您可以编写“==”而不是“-eq”,并在变量“arg”前面加上前缀有一个美元符号。那么你的脚本应该可以正常工作
工作示例(GNU bash 4.4.19):
-eq
操作仅用于比较数字
要比较字符串,请使用操作=
您忘记了Bash中变量arg
的符号$
,应该是$arg
在Bash中使用变量时,最好使用双引号
使用@()
进行多字符串比较
因此,if条件[[arg-eq“-h”]
应该是[[“$arg”=“-h”]
当将一个变量与多个字符串进行比较时,我们可以使用[“$arg”=@(-h |-h |--help |--h |--h |-help |--help)]
if [[ "$arg" = @(-h|-H|--help|--HELP|--h|--H|-help|--HELP) ]]; then
echo "Help menu requested...."
echo $'\n\n'
echo $(printf '~%.0s' {1..100})
printf ' %.0s' {1..43}
echo "Help Menu"
echo $(printf '~%.0s' {1..100})
echo $'\n'
exit 0
else
echo "Executing a program...."
./another_script.sh
fi
此外,我们可以使用框
(
)生成注释框的步骤
cat <<EOF | boxes -a c -d shell -p a5 -s 30x9
HELP MENU
bla bla
EOF
您不应该使用$arg
(例如“$arg”-eq“-h”
)。您可以使用getopts。也可以看到,(U&L.SE),(SO),(AskU)等的可能副本。双括号优于单括号。看:好的,谢谢,@JohnKugelman!然后问题应该是比较和缺少的美元符号,正如@KarstenKoop所说的。Bash支持双等号,但为了便于移植,您应该使用POSIX单等号。这非常有用。如何将空字符串添加到[“$arg”=@(-h |-h |-h |--help |--h |--h |-help]]
?[“${arg:=-h}”=@(-h |-h |-h |--help |--h |--h |-help]
“{-arg表示如果arg
未设置或empty@skrowten_hermit你是说[-z“$arg”| |“$arg”=@(-h |-h |--help |--h |--h |-help |--help)]
?是的,[${arg=-h}=-h |--help |--help |--help |--h |--h |--h |--help |--help这是你想要的。
${arg:=-h}
表示如果arg
为空或null,则将arg
设置为-h
否则arg
为原始值。因此,我们不需要在@(…)
中添加类似NULL
或undefined
的内容
cat <<EOF | boxes -a c -d shell -p a5 -s 30x9
HELP MENU
bla bla
EOF
########################################
# #
# #
# HELP MENU #
# #
# bla bla #
# #
# #
########################################