脚本参数在Bash中
我试图做一个shell脚本,应该这样使用:
ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt
然后该脚本将ocr将图像文件转换为文本文件。 这是我到目前为止所提出的:
#!/bin/bash export HOME=/home/kristoffer /usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1
但是我不知道如何得到-from
和-to
值。 任何想法如何做到这一点?
您提供给bashscript的参数将出现在variables$1
和$2
以及$3
,其中数字是指参数。 $0
是命令本身。
参数由空格分隔,所以如果你在命令中提供-from
和-to
,它们也将以这些variables结束,所以为此:
./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt
你会得到:
$0 # ocrscript.sh $1 # -from $2 # /home/kristoffer/test.png $3 # -to $4 # /home/kristoffer/test.txt
忽略-from
和-to
可能更容易,如:
ocrscript.sh /home/kristoffer/test.png /home/kristoffer/test.txt
那么你将有:
$1 # /home/kristoffer/test.png $2 # /home/kristoffer/test.txt
缺点是你必须以正确的顺序提供。 有些库可以让命令行上的命名参数更容易parsing,但是通常对于简单的shell脚本,只要使用简单的方法就可以了。
那你可以这样做:
/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1
$1
和$2
周围的双引号并不总是必要的,但build议,因为一些string不会工作,如果你不把它们放在双引号之间。
如果你不完全使用“from”和“to”作为你的选项名,用getopts来实现它是相当容易的:
while getopts f:t: opts; do case ${opts} in f) FROM_VAL=${OPTARG} ;; t) TO_VAL=${OPTARG} ;; esac done
getopts
是一个程序,处理命令行参数,并方便地为你parsing。
f:t:
指定您期望2个包含值的参数(用冒号表示)。 像f:t:v
这样的东西说-v
只会被解释为一个标志。
opts
是当前参数的存储位置。 case
陈述是你将要处理的地方。
${OPTARG}
包含参数后面的值。 例如${FROM_VAL}
会得到值/home/kristoffer/test.png
如果你运行你的脚本:
ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt
正如其他人所build议的,如果这是您第一次编写bash脚本,您应该阅读一些基本知识。 这只是关于getopts
如何工作的快速教程。
使用variables"$1"
, "$2"
, "$3"
等来访问参数。 要访问它们,你可以使用"$@"
,或者获取参数$#
(可能会检查太less或太多的参数)。
我需要确保我的脚本完全可以在各种机器,shell甚至cygwin版本之间移植。 而且,我不得不编写脚本的同事是程序员,所以我最终使用了这个:
for ((i=1;i<=$#;i++)); do if [ ${!i} = "-s" ] then ((i++)) var1=${!i}; elif [ ${!i} = "-log" ]; then ((i++)) logFile=${!i}; elif [ ${!i} = "-x" ]; then ((i++)) var2=${!i}; elif [ ${!i} = "-p" ]; then ((i++)) var3=${!i}; elif [ ${!i} = "-b" ]; then ((i++)) var4=${!i}; elif [ ${!i} = "-l" ]; then ((i++)) var5=${!i}; elif [ ${!i} = "-a" ]; then ((i++)) var6=${!i}; fi done;
理由:我还包括一个launcher.sh
脚本,因为整个操作有几个步骤是相互独立的(我说“准”,因为即使每个脚本都可以独立运行,通常是都在一起运行),在两天之内我发现,大约一半的同事,程序员和所有人都太好,不能使用启动文件,按照“用法”,或者阅读每次显示的帮助他们做了错误的事情,他们弄乱了整个事情,以错误的顺序运行带有参数的脚本,并抱怨脚本无法正常工作。 作为胆小鬼,我决定彻底改革我的脚本,以确保它们是同事certificate的。 上面的代码段是第一件事。
在bash中$1
是传递给脚本的第一个参数, $2
秒等等
/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1
所以你可以使用:
./your_script.sh some_source_file.png destination_file.txt
双引号解释;
考虑三个脚本:
# foo.sh bash bar.sh $1 # cat foo2.sh bash bar.sh "$1" # bar.sh echo "1-$1" "2-$2"
现在调用:
$ bash foo.sh "ab" 1-a 2-b $ bash foo2.sh "ab" 1-ab 2-
当你调用foo.sh "ab"
它会调用bar.sh ab
(两个参数),并用foo2.sh "ab"
调用bar.sh "ab"
(1个参数)。 一定要记住参数是如何通过bash扩展的,这会为您节省很多头痛。