Shell脚本(如果未评估条件以显示给用户的帮助信息)

时间:2018-09-06 12:17:57

标签: 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" ]] || [[ 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脚本的新手。

3 个答案:

答案 0 :(得分:6)

您的if的两个简单问题:

但是:我建议使用getopts而不是字符串比较。这样可以使零件更坚固,可以照顾到参数的不同顺序,也可以将一个字母的参数组合成一个参数。

答案 1 :(得分:3)

不幸的是,我不知道您的代码无法正常运行的确切原因,但是我可以为您提供一个快速解决方案:您可以编写“ ==”而不是“ -eq”,并在变量“ arg”前加一个美元标志。然后您的脚本应该可以正常工作。

工作示例(GNU bash 4.4.19):

arg=$1

if [[ $arg == "-h" ]] || [[ $arg == "-H" ]]; then
  echo "Help!"
else
  echo "Stop!"
fi

答案 2 :(得分:2)

  1. -eq操作仅用于比较数字。
  2. 要比较字符串,请使用操作=
  3. 您忘记了Bash中的变量$的{​​{1}}符号,应为arg
  4. 在Bash中使用变量时,最好使用双引号。
  5. 使用$arg进行多个字符串比较。

因此if条件@()应该为[[ arg -eq "-h" ]]

在将变量与多个字符串进行比较时,我们可以使用[[ "$arg" = "-h" ]]

[[ "$arg" = @(-h|-H|--help|--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 boxes - Command line ASCII boxes unlimited! )以生成评论框

boxes

输出:

cat <<EOF | boxes -a c -d shell -p a5 -s 30x9
HELP MENU

bla bla
EOF