将Bash命令行选项转换为变量名称

时间:2011-06-29 17:13:19

标签: bash

我正在尝试编写一个包含选项的bash脚本。 让我们称这些选项为A和B.

在脚本中,A和B可能会也可能不会被定义为变量。

我希望能够检查变量是否已定义。

我尝试了以下但不起作用。

if [ ! -n $1 ]; then 
   echo "Error"
fi

由于

4 个答案:

答案 0 :(得分:1)

测试变量是否设置的“正确”方法是使用+扩展选项。您会在configure脚本中看到很多内容:

if test -s "${foo+set}"

如果设置${foo+set},则"set"扩展为"",如果不设置,则${foo:+set}扩展为$foo。如果需要,这允许设置变量但是为空。 $(eval echo $a)还要求${foo:?}不为空。

(那:有问题:它很慢,而且很容易受到代码注入(!)。)

哦,如果你只是想在没有设置所需的东西时抛出一个错误,你可以将变量称为${foo:?Please specify a foo.}(如果设置则保留{{1}}但允许为空),或者是自定义错误消息{{1}}。

答案 1 :(得分:0)

不要这样做,试试这个:

if [[ -z $1 ]]; then
    echo "Error"
fi

您的版本中的错误实际上是缺少引用 应该是:

if [ ! -n "$1" ]; then
    echo "Error"
fi

但是你不需要否定,而是使用-z

如果你使用Bash,那么也可以使用双括号[[ ]]

来自man bash页面:

 -z string
      True if the length of string is zero.
 -n string
      True if the length of string is non-zero.

此外,如果您使用bash v4或更高版本(bash --version),那么-v

 -v varname
      True if the shell variable varname is set (has been assigned a value).

答案 2 :(得分:0)

您没有定义如何传递这些选项,但我认为:

if [ -z "$1" ]; then
   echo "Error"
   exit 1
fi

正是您要找的。

但是,如果其中一些选项是错误的,可选的,那么您可能需要以下内容:

#!/bin/bash
USAGE="$0: [-a] [--alpha] [-b type] [--beta file] [-g|--gamma] args..."

ARGS=`POSIXLY_CORRECT=1 getopt -n "$0" -s bash -o ab:g -l alpha,beta:,gamma -- "$@"`
if [ $? -ne 0 ]
 then
  echo "$USAGE" >&2
  exit 1
 fi
eval set -- "$ARGS"
unset ARGS

while true
 do
  case "$1" in
   -a) echo "Option a"; shift;;
   --alpha) echo "Option alpha"; shift;;
   -b) echo "Option b, arg '$2'"; shift 2;;
   --beta) echo "Option beta, arg '$2'"; shift 2;;
   -g|--gamma) echo "Option g or gamma"; shift;;
   --) shift ; break ;;
    *) echo "Internal error!" ; exit 1 ;;
  esac
 done

echo Remaining args
for arg in "$@"
 do
  echo '--> '"\`$arg'"
 done

exit 0

答案 3 :(得分:0)

诀窍是“ $ 1”,即

root@root:~# cat auto.sh
Usage () {

        echo "error"
}
if [ ! -n $1 ];then
        Usage
        exit 1
fi
root@root:~# bash auto.sh
root@root:~# cat auto2.sh
Usage () {

        echo "error"
}
if [ ! -n "$1" ];then
        Usage
        exit 1
fi
root@root:~# bash auto2.sh
error