Bash脚本数组

Bash脚本数组,bash,Bash,我试图通过bash脚本读取命令行参数,但很难获得期望的结果。我想读入两个参数,一个在-var1之后,另一个在var2之后 我正在传递这些论点 -var1 hello -var2 world args=(“$@”) x=“0” 对于((i=0;i$x)),则 var1=“${args[${i+1}]}” fi fi 回声$i 如果[${args[${i}]}==“-var2”];则 如果[$#>$x];那么 var2=“${args[${i+1}]}” fi fi 完成 它将变量var1和v

我试图通过bash脚本读取命令行参数,但很难获得期望的结果。我想读入两个参数,一个在-var1之后,另一个在var2之后

我正在传递这些论点

-var1 hello -var2 world
args=(“$@”)
x=“0”
对于((i=0;i$x)),则
var1=“${args[${i+1}]}”
fi
fi
回声$i
如果[${args[${i}]}==“-var2”];则
如果[$#>$x];那么
var2=“${args[${i+1}]}”
fi
fi
完成

它将变量
var1
var2
设置为
hello
,而不是
var1=“hello”
var2=“world”
。有什么想法吗?请提前感谢

#!/bin/bash

while [[ $# -gt 0 ]]; do
    case "$1" in
    -var1)
         var1=$2
         shift
         ;;
    -var2)
         var2=$2
         shift
         ;;
    *)
         echo "Invalid argument: $1"
         exit 1
    esac
    shift
done

if [[ -z $var1 ]]; then
    echo "Var1 was not specified."
    exit 1
fi

if [[ -z $var2 ]]; then
    echo "Var2 was not specified."
    exit 1
fi

... do something with var1 and var2

试着这样做:

#!/bin/bash

while [[ $# -gt 0 ]]; do
    case "$1" in
    -var1)
         var1=$2
         shift
         ;;
    -var2)
         var2=$2
         shift
         ;;
    *)
         echo "Invalid argument: $1"
         exit 1
    esac
    shift
done

if [[ -z $var1 ]]; then
    echo "Var1 was not specified."
    exit 1
fi

if [[ -z $var2 ]]; then
    echo "Var2 was not specified."
    exit 1
fi

... do something with var1 and var2

试着这样做:

#!/bin/bash

while [[ $# -gt 0 ]]; do
    case "$1" in
    -var1)
         var1=$2
         shift
         ;;
    -var2)
         var2=$2
         shift
         ;;
    *)
         echo "Invalid argument: $1"
         exit 1
    esac
    shift
done

if [[ -z $var1 ]]; then
    echo "Var1 was not specified."
    exit 1
fi

if [[ -z $var2 ]]; then
    echo "Var2 was not specified."
    exit 1
fi

... do something with var1 and var2

试着这样做:

#!/bin/bash

while [[ $# -gt 0 ]]; do
    case "$1" in
    -var1)
         var1=$2
         shift
         ;;
    -var2)
         var2=$2
         shift
         ;;
    *)
         echo "Invalid argument: $1"
         exit 1
    esac
    shift
done

if [[ -z $var1 ]]; then
    echo "Var1 was not specified."
    exit 1
fi

if [[ -z $var2 ]]; then
    echo "Var2 was not specified."
    exit 1
fi

... do something with var1 and var2

我同意konsolebox的观点

您的代码变量过多。
${i+1}
实际上不会执行加法。数组扩展中的
[]
中的表达式将作为算术表达式计算。请尝试以下操作:

args=("$@")
for (( i=0; i<$#; i++ ))
do
    [[ ${args[i]} == "-var1" ]] && var1=${args[++i]}
    [[ ${args[i]} == "-var2" ]] && var2=${args[++i]}
done
echo "var1='$var1'"
echo "var2='$var2'"

我们可以更动态地了解它:

args=("$@")
for (( i=0; i<$#; i++ )); do
    [[ ${args[i]} == -* ]] && declare ${args[i]#-}=${args[++i]}
done

我同意konsolebox的观点

您的代码变量过多。
${i+1}
实际上不会执行加法。数组扩展中的
[]
中的表达式将作为算术表达式计算。请尝试以下操作:

args=("$@")
for (( i=0; i<$#; i++ ))
do
    [[ ${args[i]} == "-var1" ]] && var1=${args[++i]}
    [[ ${args[i]} == "-var2" ]] && var2=${args[++i]}
done
echo "var1='$var1'"
echo "var2='$var2'"

我们可以更动态地了解它:

args=("$@")
for (( i=0; i<$#; i++ )); do
    [[ ${args[i]} == -* ]] && declare ${args[i]#-}=${args[++i]}
done

我同意konsolebox的观点

您的代码变量过多。
${i+1}
实际上不会执行加法。数组扩展中的
[]
中的表达式将作为算术表达式计算。请尝试以下操作:

args=("$@")
for (( i=0; i<$#; i++ ))
do
    [[ ${args[i]} == "-var1" ]] && var1=${args[++i]}
    [[ ${args[i]} == "-var2" ]] && var2=${args[++i]}
done
echo "var1='$var1'"
echo "var2='$var2'"

我们可以更动态地了解它:

args=("$@")
for (( i=0; i<$#; i++ )); do
    [[ ${args[i]} == -* ]] && declare ${args[i]#-}=${args[++i]}
done

我同意konsolebox的观点

您的代码变量过多。
${i+1}
实际上不会执行加法。数组扩展中的
[]
中的表达式将作为算术表达式计算。请尝试以下操作:

args=("$@")
for (( i=0; i<$#; i++ ))
do
    [[ ${args[i]} == "-var1" ]] && var1=${args[++i]}
    [[ ${args[i]} == "-var2" ]] && var2=${args[++i]}
done
echo "var1='$var1'"
echo "var2='$var2'"

我们可以更动态地了解它:

args=("$@")
for (( i=0; i<$#; i++ )); do
    [[ ${args[i]} == -* ]] && declare ${args[i]#-}=${args[++i]}
done
使用getopts->

while getopts "a:b:" flag
do
   case "$flag" in
   a) echo "var1=$OPTARG"
   ;;
   b) echo "var2=$OPTARG"
   ;;
   *) echo "Incorrect Usage"
   ;;
   esac
done
然后将其作为-a“hello”-b“world”运行

使用getopts->

while getopts "a:b:" flag
do
   case "$flag" in
   a) echo "var1=$OPTARG"
   ;;
   b) echo "var2=$OPTARG"
   ;;
   *) echo "Incorrect Usage"
   ;;
   esac
done
然后将其作为-a“hello”-b“world”运行

使用getopts->

while getopts "a:b:" flag
do
   case "$flag" in
   a) echo "var1=$OPTARG"
   ;;
   b) echo "var2=$OPTARG"
   ;;
   *) echo "Incorrect Usage"
   ;;
   esac
done
然后将其作为-a“hello”-b“world”运行

使用getopts->

while getopts "a:b:" flag
do
   case "$flag" in
   a) echo "var1=$OPTARG"
   ;;
   b) echo "var2=$OPTARG"
   ;;
   *) echo "Incorrect Usage"
   ;;
   esac
done

然后将其作为-a“hello”-b“world”运行

向我们展示您的命令行.bash程序-var1 hello-var2 world什么是
-fef
-scripts
?而且,
$x
似乎没有必要,特别是因为它总是
$i+1
。我以前看过该代码,我知道这是一种替代方法。我仍然不确定为什么上面的code不起作用,这就是我问这个问题的原因。向我们展示你的命令行。bash程序-var1 hello-var2 world什么是
-fef
-scripts
?另外,
$x
似乎没有必要,特别是因为它总是
$I+1
。我以前看过这段代码,我知道这是另一种选择方法。我仍然不确定为什么上面的代码不起作用,这就是我问这个问题的原因。向我们展示你的命令行。bash程序-var1 hello-var2 world什么是
-fef
-scripts
?另外,
$x
似乎没有必要,特别是因为它总是
$I+1
。我以前看过that代码,我理解这是另一种方法。我仍然不确定为什么上面的代码不起作用,这就是我问这个问题的原因。向我们展示您的命令行。bash程序-var1 hello-var2 world什么是
-fef
-scripts
?另外,
$x
似乎没有必要,特别是因为它总是
$i+1
。我以前看过该代码,我知道这是另一种方法。我仍然不确定为什么上面的代码不起作用,这就是我问这个问题的原因。