Command line arguments in Bash
我想写一个采用不同参数的bash脚本。它应该像普通的Linux控制台程序那样使用:
1
| my_bash_script -p 2 -l 5 -t 20 |
因此,值2应该保存在一个称为pages的变量中,参数l应该保存在一个称为length的变量中,值20应该保存在一个可变的时间中。
最好的方法是什么?
- 什么变量?参数与正在运行的程序相关,在本例中不是bash。"MyProgram"是否接受参数?
- 我想用bash编写一个程序来完成这个任务。
- 注意,除非使用"."(. myProgram -p2 -l 5 -t 20调用脚本,否则所设置的变量将只存在于myProgram中,而不是从中调用它的shell。
- 在我看来,他的意图是我的程序是一个bash脚本。在这种情况下,getopts是正确的。为了避免这种混淆,也许我的程序应该被称为我的bash_脚本。嘿,该死的,我来编辑它
使用getopts内置:这里有一个教程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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)) |
shift $((OPTIND - 1))转换命令行参数,以便可以访问脚本中可能的参数,即$1, $2, ...。
- 如果我能…
- mywiki.wooledge.org/bashfaq/035"getopt无法处理空参数字符串或嵌入空白的参数。请忘记它曾经存在过。"
- @费德里科,你那混乱的getopt和getopts…你应该仔细阅读你的引文(并请收回投票)。你也可以在这里阅读
有点像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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 |
- -1,使用getopts更好
- @史蒂文马肯齐,…我不确定我能同意。如果你看bashfaq 35,手动解析示例(这是进一步简化)做了很多getopts根本做不到的事情。因此,遵循实践更加灵活。
- @Stevenmackenzie,…我们也处在这样一个世界,人们被GNUIMS宠坏了,比如能够混合可选和位置参数(除非使用--来明确表示前者的结束和后者的开始)。在使用这种类型的解析器的默认情况下,很容易执行类似于args+=("$1" )的操作;使用getopts,OPTIND的截止点是硬的和快速的。
- bash常见问题35(如上所述)告诉了我需要知道的一切