【问题标题】:Can't assign a value to a variable in a case statement in bash无法在bash的case语句中为变量赋值
【发布时间】:2015-05-15 02:45:00
【问题描述】:

我在尝试为 case 语句中的变量赋值时遇到了一个问题,这是我的代码:

#!/bin/bash

while getopts ":m:n:::" opt; do
  case $opt in
    n)

      echo "-n was triggered, Parameter: $OPTARG " >&2
      case $OPTARG in 
        t)
            echo threads
            r=threads
            ;;
        p)
            echo processes
            r="something"
            ;;
        esac
      ;;
    m)
      echo "-m was triggered, Parameter: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

echo $r
echo No thread/processes: $2 P/T: $4 IF: $5  OF: $6

我想稍后使用变量$r,但我不能。当我尝试使用echo 打印它时(就像在我的脚本中一样),它不会返回任何东西。 我一直试图找出我的错误,但我做不到。 有一个类似的帖子建议删除=之前和之后的空格,但是你可以看到,我的没有空格。

这是我在运行控制台时得到的结果:

$ ./friendfind -n 2 -m p IN OUT
-n was triggered, Parameter: 2 
-m was triggered, Parameter: p
No thread/processes: 2 P/T: p IF: IN OF: OUT

该脚本的目的是运行一个 c 文件,并选择使用线程或进程运行它,因此它会询问您要使用的进程/线程数,如果您想使用进程或线程以及输入输出文件。

【问题讨论】:

  • r 将仅在您的调用包含-n t-n p 时设置。你有-n 2,所以r 根本不会被设置。也许您在内部 case 语句中忘记了默认情况?否则,请解释为什么您希望设置 r
  • 另外,你希望选项字符串末尾的三个冒号做什么?
  • 非常感谢,也很抱歉提出这么愚蠢的问题。我试图获得不止一个论点,但现在我觉得这也是错误的方式。
  • 该脚本的目的是运行一个 c 文件,并选择使用线程或进程运行它,因此它会询问您要使用的进程/线程数,如果您想使用进程或线程以及输入和输出文件。
  • 好的,我添加了一个答案。现在你可以编辑你的问题,让答案适合:)

标签: bash unix variable-assignment


【解决方案1】:

我认为你的目标是这样的:

#!/bin/bash
# Print usage message:
usage() {
  echo "Usage: $0 [-n N] [-t|-p] INPUT OUTPUT" >> /dev/stdout
}
# Set default values
n_threads=1  
use_threads=1
while getopts "n:pth" opt; do
  case $opt in
    n) n_threads=$OPTARG;;
    t) use_threads=1;;
    p) use_threads=0;;
    h) usage; exit 0;;
    *) usage; exit 1;;
  esac
done
# Get rid of scanned options
shift $((OPTIND-1))
if (($# != 2)); then usage; exit 1; fi
if ((use_threads)); then
  echo "Using $n_threads threads. IF: $1; OF: $2"
  # ...
else
  echo "Using $n_threads processes. IF: $1; OF: $2"
  # ...
fi

以下是一些示例调用,包括几个错误:

$ ./ff -p foo bar
Using 1 processes. IF: foo; OF: bar
$ ./ff foo bar
Using 1 threads. IF: foo; OF: bar
$ ./ff -n 7 foo bar
Using 7 threads. IF: foo; OF: bar
$ ./ff -n 7 -p foo bar
Using 7 processes. IF: foo; OF: bar
$ ./ff -p -n7 foo bar
Using 7 processes. IF: foo; OF: bar
$ ./ff -q -n7 foo bar
./ff: illegal option -- q
Usage: ./ff [-n N] [-t|-p] INPUT OUTPUT
# Note: The error message here could be more informative.
# Exercise left for the reader
$ ./ff -n 7 foo
Usage: ./ff [-n N] [-t|-p] INPUT OUTPUT

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 2011-02-15
    • 2021-08-13
    • 2019-11-24
    • 2019-08-15
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多