fix*_*it7 3 bash scripts filename
我正在寻找一种将这两者结合起来的方法,这样我就可以从命令行一步完成。(我认为%1会在命令中。)
convert Tess.jpg tess.tif
tesseract tess.tif tess
Run Code Online (Sandbox Code Playgroud)
例如:
text2file name of scanned document
Run Code Online (Sandbox Code Playgroud)
这是在 Ubuntu MATE 上。
您表示您希望能够运行
text2file name-of-scanned-documentRun Code Online (Sandbox Code Playgroud)
有两个命令的效果:
convert Tess.jpg tess.tif
tesseract tess.tif tess
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您希望编写一个简单的脚本,或者定义一个 shell 函数。您提到您认为您写的内容可能包含%1. 这是一个Windows(在这之前,DOS)批处理文件将如何使用传递给它的第一个命令行参数,但在猛砸位置参数是不是${1},${2}等1(用{ }括号下面选配${10})。所以你会写$1,而不是%1。
要制作 shell 脚本,请使用您想要的命令名称 ( text2file)创建一个文件,其中包含以下内容:
#!/bin/bash
convert "$1.jpg" "$1.tiff"
tesseract "$1.tiff" "$1"
Run Code Online (Sandbox Code Playgroud)
$1扩展为传递给脚本的第一个命令行参数。这可能包含空格,只需确保在运行脚本时将其括在引号中。在双引号围绕$1在脚本本身是防止不需要分词和通配符(这是否则将会对结果进行进一步的扩展参数扩展)。
如果您希望tesseract命令仅在convert成功时运行,那么您可以&&在convert命令后放置一个:
#!/bin/bash
convert "$1.jpg" "$1.tiff" &&
tesseract "$1.tiff" "$1"
Run Code Online (Sandbox Code Playgroud)
&&前面不能有换行符,但如果您愿意,可以在后面跟一个换行符,或者您可以删除换行符,如Giiba 的回答所示。也就是说,那里显示的技术是完全正确的(尽管它没有在编写脚本的上下文中出现)。
(&&实现这一目标的两种最流行的方法之一。另一种是set -e,在这种情况下可以正常工作,但在其某些效果中可能非常不直观。)
然后通过运行标记您的脚本可执行文件:
chmod +x text2file
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用至少包含一个/. 因此,从脚本所在的同一目录中:
./text2file name-of-scanned-documentRun Code Online (Sandbox Code Playgroud)
为了能够在text2file任何地方运行它,请将文件放在$PATH环境变量中列出的目录中。我推荐~/bin(即,bin直接位于主目录中的目录)。如果此目录不存在,您可以创建它。在所有后续登录中,它将被$PATH自动添加到,因为~/.profile包含检查是否~/bin存在的代码,如果存在则将其添加到前面$PATH。
然后你会运行:
text2file name-of-scanned-documentRun Code Online (Sandbox Code Playgroud)
对于您给出的示例,这只是:
text2file tess
Run Code Online (Sandbox Code Playgroud)
$1扩展到以tess这种方式运行时,因此您不应该(实际上不能)tess在运行后编写文件类型后缀。下面是一个示例,说明当名称two words包含空格时如何运行它:
text2file 'two words'
Run Code Online (Sandbox Code Playgroud)
相反,如果您更喜欢实现text2file为 shell 函数,您可以将此定义放在 的底部~/.bashrc:
text2file() {
convert "$1.jpg" "$1.tiff"
tesseract "$1.tiff" "$1"
}
Run Code Online (Sandbox Code Playgroud)
或者:
text2file() {
convert "$1.jpg" "$1.tiff" &&
tesseract "$1.tiff" "$1"
}
Run Code Online (Sandbox Code Playgroud)
然后在您随后启动的所有交互式 Bash shell 中,它将可用。如果您想在已经启动的 shell 中使用它,您可以 source ~/.bashrc( . ~/.bashrc),或者您可以直接在 shell 中运行该函数定义(即上面显示的代码)。
使用交互式 Bash shell 时,运行它的方式与将其编写为脚本并将其放在$PATH.
1从技术上讲,位置参数本身就是 1(not$1或${1})、2(not$2或${2}),等等。同样,从技术上讲,您没有$PATH环境变量,因为环境变量称为PATH。与某些语言(例如 Perl、PowerShell)不同,前导$(以及随后的封闭{ },如果存在)实际上并不是参数或变量名称的一部分,而是用于触发参数扩展的语法。