- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下代码:
while getopts ":p:t:n:" o; do
case "${o}" in
p)
p=${OPTARG}
numep=$p
mkdir $numep
;;
t)
t=${OPTARG}
tip=$t
if [ $tip == "c" ]; then
touch $numep/$numep.c
touch $numep/$numep.h
elif [ $tip == "c++" ]; then
touch $numep/$numep.cpp
touch $numep/$numep.h
fi
;;
n)
n=${OPTARG}
nrFis=$n
if [ $tip == "c" ]; then
for i in $(seq $n); do
touch $numep/src/$numep$i.c
touch $numep/inc/$numep$i.h
done
elif [ $tip == "c++" ]; then
for i in $(seq $n); do
touch $numep/src/$numep$i.cpp
touch $numep/inc/$numep$i.h
done
fi
;;
*)
err-help
;;
esac
done
err-help 是一个预先定义的函数,它提供正确调用的指令。
脚本的正确调用如下所示:./script.sh -p project_name -t project_type -n source_files_number
我想做什么:为 c 或 c++ 项目创建一个包含特定数量源文件的目录。
我的问题是:如何使用 ${OPTARG} ? p=${OPTARG} 究竟是什么东西? p、t、n 变量会填充正确的内容吗?请问我怎么做对的? :(
最佳答案
您正确地使用了 getopts
,但是您假设了您将看到选项的顺序。稍后会详细介绍。
让我们看一下 help getopts
OPTSTRING contains the option letters to be recognized; if a letteris followed by a colon, the option is expected to have an argument,which should be separated from it by white space.
... When an option requires an argument,getopts places that argument into the shell variable OPTARG.
这就是 getopts 的魔力。由于您将 p:
添加到您的 optstring 中,当 $o
= "p"时,变量 $OPTARG
将包含您提供给 -p
,在本例中为字符串“project_name”。
现在进行一些代码审查:
case "${o}" in
p)
p=${OPTARG}
numep=$p
mkdir $numep
;;
如果你使用数组,你只需要使用大括号,或者你需要从周围的文本中消除变量名的歧义($o_x
vs ${o}_x
) 这样写会更整洁
case "$o" in ...
您不需要创建与选项同名的特殊变量。你从不使用 $p
。你可以只写
numep="$OPTARG"
总是引用你的变量。总是。除非你特别知道什么时候不引用它们。如果我提供 -p "some dir with spaces"
,则 mkdir $numep
将创建 4 目录。你需要写
mkdir "$numep"
如果 $numep 目录已经存在,您将收到一条错误消息。如果您不想这样,请使用 mkdir -p "$numep"
(参见 man mkdir
)
现在,要解决我的第一个问题:调用您的脚本并以任何顺序提供选项没有任何问题
./script.sh -t project_type -n source_files_number -p project_name
您的选项解析假设,在 t
和 n
分支中,您已经设置了 $numep,因此您假设用户提供了 -p
第一个。如果 -t
先出现,则 $numep 为空,您将尝试创建文件 /.h
。即使你有权限写入根目录,这也不是你想要做的。在开始做事之前解析所有您的选项。
我会这样写:
while getopts ":p:t:n:" o; do
case "$o" in
p) numep="$OPTARG" ;;
t) case "$OPTARG" in
c) ext="c" ;;
"c++") ext="cpp" ;;
*) echo "Error: use 'c' or 'c++' for -t option" >&2
exit 1
;;
esac
;;
n) nrFis="$OPTARG" ;;
*) err-help ;;
esac
done
mkdir -p "$numep"
touch "$numep/$numep.$ext"
touch "$numep/$numep.h"
for ((i=1; i<=$nrFis; i++)); do
touch "$numep/src/$numep$i.$ext"
touch "$numep/inc/$numep$i.h"
done
关于linux - 如何在 getopts 上使用 ${OPTARG}?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36247416/
我正在从用户那里获取命令行参数。 然后我为命令做 switch case,例如: case 'f': *file_name = optarg; break;
我希望能够为 -a arg 获取 2 个值,例如:-a min max 我有以下代码: while((opt = getopt(argc,argv,"a:c:k:rv")) != -1) {
我正在尝试在 optarg 上使用 atoi,但它也可能是任何东西。我一直在试图弄清楚为什么我的 getopt_long 不起作用。当我输入我的 switch 语句时,optarg 设置为 null
Optarg 始终为空。应用程序崩溃。 static const char* const short_options = "a:h:p"; static const struct option lon
尝试使以下 C 代码工作,但每次我给它一个文件以返回它的大小时,都会说文件名为空。 我尝试过的示例命令行: 问题7 -h -t -f 问题8.c 无论如何,它返回 optarg 为 null。我不确定
我有一个程序需要使用以下方式调用: program parameter1 parameter2 -x1 -y 但我觉得如果我这样做应该会起作用: program -x1 -y parameter1 p
我希望能够在我的脚本中接受强制和可选标志。这是我目前所拥有的。 #!bin/bash while getopts ":a:b:cdef" opt; do case $opt in
我想在争论后得到更多的 optargs,但我不知道该怎么做。我想像 这样调用我的程序 ./test -a first second -b third 我现在只能在参数 -a 后获得一个值。当我尝试将两
我是C编程的新手,我对C++有一些经验,但对C一无所知。我有一个关于getopt optarg参数的问题,它是一个字符串。我想检查 -x 标志的输入参数是否等于“dog”。我当前的代码如下所示: in
我有下一个代码。 int opt; while ((opt = getopt(_argc, _argv, "n:pcs:")) != -1) { switch (opt) {
您好,我正在研究一本书中的一个程序。该程序几乎按预期运行,除了一个错误。每次我尝试使用“-l”大小写时,我都会遇到段错误。有什么想法吗? #include #include int main(in
考虑以下代码: int number; while((w = getopt(argc, argv, "n:s:")) != -1) { switch (w){
这个问题特别涉及 gcc 中可选参数的 getopt。当一个选项被定义为有一个可选参数并且没有给出参数时,optarg 被设置为一个空指针或一个指向空字符串的指针。手册似乎没有处理这种情况。行为是否得
我正在使用 getopt 来解析传递给我的 c 程序的参数。我想在解析时检查 optarg 是否全是数字,但我不知道如何获取 optarg 中值的长度: int opt; unsigned short
您好,我正在编写一个简单的客户端-服务器程序。在这个程序中,我必须使用 getopt() 来获取端口号和 IP 地址,如下所示: 服务器 -i 127.0.0.1 -p 10001 我不知道如何从 o
我是 getopt(3) 的新手,查看了一些示例并遇到了 this one . 这些行 case 'c': cvalue = optarg; break; 我觉得很奇怪,因为 op
我需要这样调用我的程序: ./program hello -r foo bar 我从 argv[1] 中打招呼,但我在使用值 bar 时遇到问题,我是否也应该将“r:”更改为其他内容? while((
有人可以检查此代码片段并告诉我为什么当我使用 -p abcdef 调用此脚本时 $OPTARG 从未具有传入的参数值吗? # Process command-line options passed a
通过实验,我似乎可以捕获 optarg 的连续值。迭代时 int getopt(int argc, char * const argv[], const char *optstring)并稍后引用它们
我正在尝试使用 GNU getopt 函数解析我的 C 程序中的一些命令行参数。假设我调用以下电话: ./my_program -E 16 -t path/to/file 我目前的期望是,如果我有以下
我是一名优秀的程序员,十分优秀!