无法为 bash 中的 case 语句中的变量赋值
Can't assign a value to a variable in a case statement in bash
我 运行 在尝试为 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: P/T: IF: OF:
我想稍后使用变量 $r
,但我不能。当我尝试使用 echo
打印它时(就像在我的脚本中一样),它没有 return 一个东西。
我一直试图找出我的错误,但我做不到。
有一个类似的post建议去掉=
前后的空格,但是大家可以看到,我的
里面没有空格
这是我在 运行 时从控制台得到的信息:
$ ./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 文件,因此它会询问您要使用的 processes/threads 数量, 如果你想使用进程或线程以及输入和输出文件。
我认为你的目标是这样的:
#!/bin/bash
# Print usage message:
usage() {
echo "Usage: [=10=] [-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: ; OF: "
# ...
else
echo "Using $n_threads processes. IF: ; OF: "
# ...
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
我 运行 在尝试为 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: P/T: IF: OF:
我想稍后使用变量 $r
,但我不能。当我尝试使用 echo
打印它时(就像在我的脚本中一样),它没有 return 一个东西。
我一直试图找出我的错误,但我做不到。
有一个类似的post建议去掉=
前后的空格,但是大家可以看到,我的
这是我在 运行 时从控制台得到的信息:
$ ./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 文件,因此它会询问您要使用的 processes/threads 数量, 如果你想使用进程或线程以及输入和输出文件。
我认为你的目标是这样的:
#!/bin/bash
# Print usage message:
usage() {
echo "Usage: [=10=] [-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: ; OF: "
# ...
else
echo "Using $n_threads processes. IF: ; OF: "
# ...
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