Linux 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" ]] || [

我已经编写了一个帮助菜单,作为有关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" ]] || [[ 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                #
    #                                      #
    #                                      #
    ########################################