Bash 中的脚本参数
- 2024-10-12 10:28:00
- admin 原创
- 90
问题描述:
我正在尝试编写一个 shell 脚本,其使用方式如下:
ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt
然后,脚本会将图像文件转换为文本文件。以下是我目前想到的:
#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1
但我不知道如何获取-from
和-to
值。有什么想法吗?
解决方案 1:
您提供给 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
并非总是必要的,但建议使用,因为如果不将某些字符串放在双引号之间,它们将不起作用。
解决方案 2:
如果您不完全习惯使用“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
工作的快速教程。
解决方案 3:
使用变量"$1"
、"$2"
等"$3"
来访问参数。要访问所有参数"$@"
,可以使用 或 来获取参数数量$#
(可能有助于检查参数是否太少或太多)。
解决方案 4:
我需要确保我的脚本可以在各种机器、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
还包含了一个脚本,因为整个操作有几个步骤,它们几乎是相互独立的(我说“几乎”,因为即使每个脚本都可以单独运行,但它们通常一起运行),两天后我发现,大约有一半的同事,都是程序员,太好用了,以至于不使用启动器文件,遵循“用法”,或者阅读每次做错事时显示的帮助,他们把整个事情搞得一团糟,以错误的顺序运行带有参数的脚本,并抱怨脚本无法正常工作。作为一个脾气暴躁的人,我决定彻底检查我的所有脚本,以确保它们对同事来说是安全的。上面的代码段是第一件事。
解决方案 5:
在 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 中是如何传递和扩展的,这将为你省去很多麻烦。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件