相关疑难解决方法(0)

如何使用getopt在UNIX中创建多字符参数?

我正在尝试创建一个getopt命令,这样当我将"-ab"参数传递给脚本时,该脚本会将-ab视为单个参数.

#!/bin/sh
args=`getopt "ab":fc:d $*`
set -- $args
for i in $args
do
case "$i" in
        -ab) shift;echo "You typed ab $1.";shift;;
        -c) shift;echo "You typed a c $1";shift;;
esac
done
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用.有人可以提供任何帮助吗?

unix getopt

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

如何用选项编写Unix shell脚本?

我不知道是否可能,但我想编写shell脚本,其作用类似于带有选项的常规可执行文件.作为一个非常简单的示例,请考虑配置为可执行的shell脚本foo.sh:

    ./foo.sh
    ./foo.sh -o
Run Code Online (Sandbox Code Playgroud)

而代码的foo.sh作用就像

    #!/bin/sh
    if  ## option -o is turned on
        ## do something
    else
        ## do something different
    endif
Run Code Online (Sandbox Code Playgroud)

有可能,怎么做?谢谢.

shell

16
推荐指数
2
解决办法
5万
查看次数

shell脚本的跨平台getopt

我刚刚发现这getopt不是跨平台的(特别是对于FreeBSD和Linux).这个问题的最佳解决方法是什么?

bash shell cross-platform getopt

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

如何解析shell中的长格式参数?

我看到的所有东西getopt或者getopts只是支持单字符选项的略微发烧友(例如-h但不是--help).我想做一些花哨的长期选择.

bash shell sh

11
推荐指数
2
解决办法
9728
查看次数

在Bash中解析命令行参数的最佳方法?

经过几天的研究,我仍然无法找到在.sh脚本中解析cmdline args的最佳方法.根据我的参考资料,getopts cmd是要走的路,因为它"在不干扰位置参数变量的情况下提取和检查开关.意外的开关或缺少参数的开关被识别并报告为错误. "

当涉及空格但是可以识别常规和长参数(-p和--longparam)时,位置参数(例如2 - $ @,$#等)显然不能正常工作.我注意到,当使用嵌套引号传递参数时,这两种方法都会失败("这是"引用""引号"".").这三个代码示例中哪一个最能说明处理cmdline args的方法?大师不推荐使用getopt函数,所以我试图避免它!

例1:

#!/bin/bash
for i in "$@"
do
case $i in
    -p=*|--prefix=*)
    PREFIX=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`

    ;;
    -s=*|--searchpath=*)
    SEARCHPATH=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
    ;;
    -l=*|--lib=*)
    DIR=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
    ;;
    --default)
    DEFAULT=YES
    ;;
    *)
            # unknown option
    ;;
esac
done
exit 0
Run Code Online (Sandbox Code Playgroud)

例2:

#!/bin/bash
echo ‘number of arguments’
echo "\$#: $#"
echo ”

echo ‘using $num’
echo "\$0: $0"
if [ $# -ge 1 ];then …
Run Code Online (Sandbox Code Playgroud)

bash command-line getopts

11
推荐指数
2
解决办法
5万
查看次数

将字符串转换为参数时,Bash不解析引号

这是我的问题.在bash 3中:

$ test='One "This is two" Three'
$ set -- $test
$ echo $2
"This
Run Code Online (Sandbox Code Playgroud)

如何获得的bash了解行情,并返回$ 2作为This is two和不"This?不幸的是,我不能改变test这个例子中调用的变量的构造.

string bash arguments spaces quoting

11
推荐指数
2
解决办法
2981
查看次数

getopts检查互斥参数

我有一个简单的脚本(下面),它具有互斥的参数.

./scriptname.sh -m|-d [-n]但是,脚本的参数应该是用户可以运行./scriptname.sh -m -d错误的脚本.

问题:如何强制用户只提供了一个互斥参数?

#!/bin/sh

usage() {
   cat <<EOF
Usage: $0 -m|-d [-n]
where:
    -m create minimal box
    -d create desktop box
    -n perform headless build
EOF
   exit 0
}

headless=
buildtype=

while getopts 'mdnh' flag; do
  case "$flag" in
    m) buildtype='minimal' ;;
    d) buildtype='desktop' ;;
    n) headless=1 ;;
    h) usage ;;
    \?) usage ;;
    *) usage ;;
  esac
done

[ -n "$buildtype" ] && usage
Run Code Online (Sandbox Code Playgroud)

bash getopts

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

如何在 zsh 中创建可以接受无序参数的脚本?

所以我正在 zsh 中编写一个小脚本,它可以接受多个参数。然而,用户碰巧传递的参数是无序的。例如,这将是对脚本的有效调用:

./logproc.sh --include /var/log --exclude-file-ext gz,bz --show-only
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用 $1、$2 等位置参数来期望--include首先、然后--exclude-file-ext等等。但用户是这样调用脚本的:

./logproc.sh --show-only --exclude-file-ext gz,bz --include /var/log
Run Code Online (Sandbox Code Playgroud)

或者

./logproc.sh --exclude-file-ext gz,bz --show-only --include /var/log
Run Code Online (Sandbox Code Playgroud)

随着时间的推移,添加更多功能的需求不断增加,并且确定传递给脚本的参数的排列和组合将会呈爆炸式增长。

zsh 中是否有内置工具或命令(可以在脚本中调用的外部工具)可用于找出发送到脚本的参数?

PS:我正在寻找 ZSH 特定的解决方案。

shell scripting zsh function

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

在Bash中,如何将选项标志值存储在变量中?

编写Bash脚本时,当作为命令行中选项标志的一部分提供时,如何从命令行获取值?

例如以下内容:

./script --value=myText --otherValue=100
Run Code Online (Sandbox Code Playgroud)

如何将myText100值存储在变量$textand中$num

bash

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

Bash getopts命令

我在他们的网站上关注IBM的例子:

(清单#5)http://www.ibm.com/developerworks/library/l-bash-parameters/index.html

#!/bin/bash
echo "OPTIND starts at $OPTIND"
while getopts ":pq:" optname
  do
    case "$optname" in
      "p")
        echo "Option $optname is specified"
        ;;
      "q")
        echo "Option $optname has value $OPTARG"
        ;;
      "?")
        echo "Unknown option $OPTARG"
        ;;
      ":")
        echo "No argument value for option $OPTARG"
        ;;
      *)
      # Should not occur
        echo "Unknown error while processing options"
        ;;
    esac
    echo "OPTIND is now $OPTIND"
  done
Run Code Online (Sandbox Code Playgroud)

我想要的是有一个名字超过1个字母的选项.即-pppp和-qqqq而不是-p和-q.

我写了我的程序并实现-help给了我一个问题......

bash getopts

3
推荐指数
1
解决办法
5421
查看次数