Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash中的命令行参数_Bash_Command Line Arguments - Fatal编程技术网

Bash中的命令行参数

Bash中的命令行参数,bash,command-line-arguments,Bash,Command Line Arguments,我想写一个接受不同参数的bash脚本。它应该像普通的linux控制台程序一样使用: my_bash_script -p 2 -l 5 -t 20 因此,值2应保存在名为pages的变量中,参数l应保存在名为length的变量中,值20应保存在变量time中 最好的方法是什么?类似于 pages= length= time= while test $# -gt 0 do case $1 in -p) pages=$2 sh

我想写一个接受不同参数的bash脚本。它应该像普通的linux控制台程序一样使用:

my_bash_script -p 2 -l 5 -t 20
因此,值2应保存在名为pages的变量中,参数l应保存在名为length的变量中,值20应保存在变量time中


最好的方法是什么?

类似于

pages=
length=
time=

while test $# -gt 0
do
    case $1 in
        -p)
            pages=$2
            shift
            ;;
        -l)
            length=$2
            shift
            ;;
        -t)
            time=$2
            shift
            ;;
        *)
            echo >&2 "Invalid argument: $1"
            ;;
    esac
    shift
done

使用
getopts
builtin:


shift$((OPTIND-1))
移动命令行参数,以便您可以访问脚本的可能参数,即
$1,$2,…

什么中的变量?参数与正在运行的程序相关,在本例中与bash无关。“myProgramm”是否接受参数?我想在bash中编写一个执行此操作的程序。请注意,除非使用“.”(
.myProgram-p2-l 5-t 20
)调用脚本,否则设置的变量将只存在于
myProgram
中,不是你称之为shell的shell。在我看来,他的意图是myProgramm是一个bash脚本。在这种情况下,getopts是正确的。为了避免这种混淆,也许我的程序应该称为my_bash_脚本。嘿,见鬼,我会编辑它“getopt无法处理空参数字符串或带有嵌入空格的参数。请忘记它曾经存在。”@Federico你的困惑
getopt
getopts
。。。你应该仔细阅读你的引文(请撤回否决票)。您还可以阅读-1,使用起来更好getopts@StevenMackenzie,…我不确定我是否同意。如果您看一下,手动解析示例(这是进一步的简化)做了许多getopts无法做的事情。因此,遵循这种做法更为灵活。@StevenMackenzie,……我们所处的世界中,人们也被GNUISM所宠坏,比如能够混合使用可选参数和位置参数(除非使用
--
明确地表示前者的结束和后者的开始)。在默认情况下,使用此类解析器可以轻松地执行类似于
args+=(“$1”)
的操作;对于getopts,在
OPTIND
处的截止是非常困难的。Bash常见问题35(如上)告诉了我需要知道的一切
pages=  length=  time=

while getopts p:l:t: opt; do
  case $opt in
  p)
      pages=$OPTARG
      ;;
  l)
      length=$OPTARG
      ;;
  t)
      time=$OPTARG
      ;;
  esac
done

shift $((OPTIND - 1))