Bash 中的脚本参数

2024-10-12 10:28:00
admin
原创
251
摘要:问题描述:我正在尝试编写一个 shell 脚本,其使用方式如下:ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt 然后,脚本会将图像文件转换为文本文件。以下是我目前想到的:#!/bin/bash export ...

问题描述:

我正在尝试编写一个 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 中是如何传递和扩展的,这将为你省去很多麻烦。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1553  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   27  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   22  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   19  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用