Bash:奇怪的解析输出?

Bash:奇怪的解析输出?

我正在编写一个简单的脚本,它按顺序接受多个命令行参数:

#!/bin/bash

function arg_parser () {
while [[ $# != 0 ]] ; do
  case "$1" in
    --one)
      varone="$2"
      ;;
    --two)
      vartwo="$2"
      ;;
    --three)
      varthree="$2"
      ;;
    --four)
      varfour="$2"
      ;;
    --five)
      varfive="$2"
      ;;
  esac
  shift
done
}

arg_parser "$@"

echo $varone
echo $vartwo
echo $varthree
echo $varfour
echo $varfive

然后运行它:

./test.sh --one testone --three testthree --two testtwo --five "test five" --four "$$$$"
testone
testtwo
testthree
793793
test five

请注意如何--four返回“793793”而不是“$$$$”?有谁知道为什么会发生这种情况和/或如何改进脚本以防止这种情况发生?

答案1

$$是一个特殊变量,它扩展为 shell 的进程 ID,在本例中是在脚本启动之前的命令行上。尝试类似的东西echo $$。您需要用反斜杠转义美元符号或将它们放在单引号中以免它们扩展,即echo '$$$$'

双引号没有帮助,它们只会阻止扩展值的单词分割,就像常规变量($foovs. "$foo")一样。

另外,在您的循环中,shift即使您也使用第二个参数,您也只能使用一次。这意味着选项的参数也被作为选项本身处理:

$ ./test.sh --one --two --three --four --five xyz
--two
--three
--four
--five
xyz

如果您不希望这样,则在使用后需要shift额外的时间$2

while [[ "$#" != 0 ]] ; do
  case "$1" in
    --one)
      varone="$2"
      shift
      ;;
    --two)
      vartwo="$2"
      shift
      ;;
    # ...
  esac
  shift
done

相关内容