我正在尝试制作一个应该像这样使用的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
值。关于如何做的任何想法?
答案 0 :(得分:103)
您提供给bashscript的参数将显示在变量$1
和$2
以及$3
中,其中数字指的是参数。 $0
是命令本身。
参数由空格分隔,因此如果您在命令中提供-from
和-to
,它们也会在这些变量中结束,所以为此:
./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
缺点是你必须以正确的顺序提供它。有些库可以更容易地在命令行上解析命名参数,但通常对于简单的shell脚本,如果没有问题,你应该使用简单的方法。
然后你可以这样做:
/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1
$1
和$2
周围的双引号并非总是必要,但建议使用,因为如果不将它们放在双引号之间,某些字符串将无效。
答案 1 :(得分:62)
如果您没有完全依赖使用“from”和“to”作为选项名称,使用getopts实现此功能相当容易:
while getopts f:t: opts; do
case ${opts} in
f) FROM_VAL=${OPTARG} ;;
t) TO_VAL=${OPTARG} ;;
esac
done
getopts
是一个处理命令行参数的程序,可以方便地为您解析它们。
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
正如其他人所建议的那样,如果这是你第一次写bash脚本,你应该阅读一些基础知识。这只是getopts
如何运作的快速教程。
答案 2 :(得分:30)
使用变量"$1"
,"$2"
,"$3"
等来访问参数。要访问所有这些,您可以使用"$@"
,或获取参数计数$#
(可能有助于检查参数太少或太多)。
答案 3 :(得分:19)
我需要确保我的脚本在各种机器,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
脚本,因为整个操作有几个步骤,彼此是准独立的(我说&#34;准&#34;,因为即使每个脚本都可以单独运行,它们通常都是一起运行的),在两天内我发现,大约一半的同事,程序员和所有人,都太好了,无法使用启动器文件,请按照& #34;使用&#34;,或阅读每次出错时显示的帮助,他们弄乱了整个事情,用错误的顺序运行脚本并抱怨脚本没有好好工作。作为胆怯的我,我决定彻底检查我的所有剧本,以确保他们是同事证明。上面的代码段是第一件事。
答案 4 :(得分:6)
在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 "a b"
1-a 2-b
$ bash foo2.sh "a b"
1-a b 2-
当你调用foo.sh "a b"
时,它会调用bar.sh a b
(两个参数),而foo2.sh "a b"
会调用bar.sh "a b"
(1个参数)。始终记住参数如何在bash中传递和扩展,它将为您节省很多麻烦。