标签: getopts

bash getopts,仅短选项,都需要值,自己的验证

我正在尝试构建一个接受各种选项的 shell 脚本,这getopts似乎是一个很好的解决方案,因为它可以处理选项和参数的可变排序(我认为!)。

我只会使用短选项,每个短选项都需要一个相应的值,例如:./command.sh -a arga -g argg -b argb但我希望允许以非特定顺序输入选项,这是大多数人习惯使用 shell 命令的方式.

另一点是我想自己检查选项参数值,最好是在case语句中。这样做的原因是我:)case声明中的测试产生了不一致的结果(可能是由于我缺乏理解)。
例如:

#!/bin/bash
OPTIND=1 # Reset if getopts used previously
if (($# == 0)); then
        echo "Usage"
        exit 2
fi
while getopts ":h:u:p:d:" opt; do
        case "$opt" in

                h)
                        MYSQL_HOST=$OPTARG
                        ;;
                u)
                        MYSQL_USER=$OPTARG
                        ;;
                p)
                        MYSQL_PASS=$OPTARG
                        ;;
                d)
                        BACKUP_DIR=$OPTARG
                        ;;
                \?)
                        echo "Invalid option: -$OPTARG" >&2
                        exit 2;;
                :)
                       echo "Option -$OPTARG requires an argument" >&2
                       exit 2;; …
Run Code Online (Sandbox Code Playgroud)

bash getopts

8
推荐指数
1
解决办法
2万
查看次数

在 getopts 中没有指定选项时执行默认选项

我按照这里的教程学习如何使用getopts. 我能够执行用户正确提供的所有选项。但是现在我想在没有提供任何选项时执行默认选项。

例如:

while getopts ":hr" opt; do
    case $opt in
        h )
            show_help;
            exit 1
            ;;
        r )
          echo "Default option executed"
          ;;
    esac
done
Run Code Online (Sandbox Code Playgroud)

因此,如果用户提供-h-r,则应执行相应的命令(实际上确实如此),但是当没有提供这些选项时-r,默认情况下应执行。有没有办法实现这一目标?

更新

我尝试了cas's建议并包含*)在我的getopts功能中,但似乎没有发生任何事情。

while getopts ":hr" opt; do
    case $opt in
        h )
            show_help;
            exit 1
            ;;
        r )
          echo "Default option executed"
          ;;

        \? )
          echo error "Invalid option: -$OPTARG" >&2
          exit 1
          ;;

        : )
          echo …
Run Code Online (Sandbox Code Playgroud)

shell-script getopts

7
推荐指数
2
解决办法
1万
查看次数

Bash:为什么在解析命令行参数的脚本中使用 eval 和 shift?

当我在看这个答案/sf/answers/774563751/以弄清楚如何使用参数时,--something或者-s关于答案脚本的一些问题:

#!/bin/bash
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
     -n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"

while true ; do
    case "$1" in
        -a|--a-long) echo "Option a" ; shift ;;
        -b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;;
        -c|--c-long) 
            # c has an optional argument. As we …
Run Code Online (Sandbox Code Playgroud)

bash shell-script getopts eval

7
推荐指数
1
解决办法
3942
查看次数

哪个是更标准的包,getopt 或 getopts(带有“s”)?

标准实用程序的 Linux 基础列表包括getopts但不包括getopt. Posix 实用程序的Open Group列表类似。

同时,维基百科的标准 Unix 命令列表包括getopt但不包括getopts. 同样,Windows Subsystem for Linux(基于 Ubuntu 基于 Debian)也包括getopt但不包括getopts(它是GNU 增强版)。

balter@spectre:~$ which getopt
/usr/bin/getopt
balter@spectre:~$ getopt -V
getopt from util-linux 2.27.1
balter@spectre:~$ which getopts
balter@spectre:~$ 
Run Code Online (Sandbox Code Playgroud)

因此,如果我想选择一个我最有信心使用更标准 Linux 发行版(例如 Debian、Red Hat、Ubuntu、Fedora、CentOS 等)的人,我应该选择哪个?

笔记:

感谢 Michael 和 Muru 解释了内置与可执行文件。我刚刚也偶然发现了这个,其中列出了 bash 内置函数。

linux posix getopts

7
推荐指数
2
解决办法
1934
查看次数

Getopts 选项处理,是否可以添加非连字符 [FILE]?

我正在使用getopts所有需要高级选项解析的脚本,并且它与dash. 我熟悉标准的基本getopts用法,包括[-x][-x OPTION]

是否可以解析这样的选项?

 dash_script.sh FILE -x -z -o OPTION
 ## Or the inverse?
 dash_script.sh -x -z -o OPTION FILE
Run Code Online (Sandbox Code Playgroud)

shell options dash parameter getopts

6
推荐指数
1
解决办法
5785
查看次数

shell 脚本选项传递给子命令

我正在编写一个包装脚本,用于getoptsmysqldump. 到目前为止,它运行良好。

然而,我想做的一件事是能够在我的 shell 脚本中添加另一个选项,其内容应该准确地传递给 mysqldump 命令。有点像这样传递的选项:
./mysqldumpwrapper.sh -u username -p password -h localhost -o "--no-create-db --replace"
-o 参数的字符串内容完全传递给我的mysqldump命令。

因为我getopts在尝试上述操作时正在使用,所以我得到以下输出:
Invalid option: --

有谁知道如何解决这个问题?
有没有办法逃避选项的输入,这样getopts就不会将内容解析为另一个选项?

然后,当涉及到从我的 shell 脚本触发实际命令时,这就是我所得到的:
mysqldump "$OPTIONSPASSTHROUGH" --host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASS "$DB" > "$FILE_DEST"
因为 OPTIONSPASTHROUGH 变量中很可能有空格,所以我在该命令中引用了该变量。那是对的吗?

bash getopts arguments

5
推荐指数
1
解决办法
4657
查看次数

为什么一些实用程序在选项之前解析操作数?

根据几个 来源,UNIX 实用程序指南指定操作数应始终在选项之后处理:

utility_name[OPTIONS][operands...]
Run Code Online (Sandbox Code Playgroud)

众所周知,一些较旧的 UNIX 实用程序并不完全遵循这些约定,例如 ,find但较新的和完善的实用程序也违反了规则而没有明显的解释,例如curl <url>

我想知道这是否有充分的理由以及社区对此的普遍共识是什么。

options conventions utilities getopts

5
推荐指数
0
解决办法
374
查看次数

如何修复从 getopt 收到的参数?

我的脚本中有以下命令:

set -- `getopt -q agvc:l:t:i: "$@"` 
... 

while [ -n "$1" ] 
do 
-i) TIME_GAP_BOOT=$2 
shift ;; 

... 
sleep $TIME_GAP_BOOT
Run Code Online (Sandbox Code Playgroud)

使用 调用脚本时-i 2,出现错误

sleep: invalid time interval `\'2\''
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?如何正确格式化参数?

bash getopts bash-script

4
推荐指数
1
解决办法
2416
查看次数

bash 脚本:设置的参数值不正确

问题

我有一个接受几个不同(可选)命令行参数的脚本。对于一个特定的论点,我得到了“less”的值,但我不知道为什么。

重击代码

while getopts ":d:f:p:e:" o; do
  case "${o}" in
        d)
            SDOMAIN=${OPTARG}
            ;;
        f)
            FROM=${OPTARG}
            ;;
        p)
            PAGER=${OPTARG}
            ;; 
        e)
            DESTEXT=${OPTARG}
            ;;                       
        *)
            show_usage
            ;;          
    esac
done

source "./utils.sh"
test #test includes

echo "$SDOMAIN is the sdomain"
echo "$FROM is the from"
echo "$PAGER is the pager"
echo "$DESTEXT is the extension"

exit
Run Code Online (Sandbox Code Playgroud)

输出

当我运行我的脚本时,这是我看到的:

lab-1:/tmp/jj# bash mssp.sh -d testdomain.net         
Utils include worked!                                       
testdomain.net is the sdomain                                               
 is the from                                                                    
less is the pager                                                               
 is the extension                                 
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我在寻呼机中得到“更少”的价值。我希望看到空字符串。如果你能看到我的错误,请告诉我。我已经看这个太久了。

bash getopts variable

4
推荐指数
1
解决办法
317
查看次数

当在 while 循环内调用函数时,getopts 不会获取任何参数

我试图在 while 循环中调用一个函数并传递一些参数。但是,getopts只能获取第一次调用的参数。

这是一个最小的例子:

function add_all_external_services() {
  env | sed -n "s/^EXTERNAL_SERVICE_OPTIONS_\(.*\)$/\1/p" > options

  while read -r line
  do
    key="${line%%=*}"
    opt="${line#*=}"

    if [[ -n "$key" && -n "$opt" ]]; then
      echo "Adding external service \"$key\" with options: \"$opt\""
      add_external_service $opt
    else
      echo "Missing one or more variables:
  - Key: \"$key\"
  - Options: \"$opt\"
"
    fi
  done < options

  rm options
}

function add_external_service() {
  local local_service_name=""
  local external_service_name=""
  local external_service_namespace=""
  local service_url=""

  echo "    Options: $@"
  while getopts …
Run Code Online (Sandbox Code Playgroud)

bash shell-script getopts arguments

4
推荐指数
1
解决办法
1794
查看次数