脚本参数在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扩展的,这会为您节省很多头痛。