根据参数选择编辑器打开文件的脚本

根据参数选择编辑器打开文件的脚本

我想fastex使用两个可能的参数(gt)运行我的脚本,例如fastex g.

根据我想打电话的论点geany $filetexstudio $file。这是选择编辑器。

我试过

editor=$1
if ["$1" = "g"]; then
geany "$file".tex
exit 1
else
linha=$(wc -l < "$file".tex)
texstudio --line $linha  "$file".tex
exit 1
fi

但 的输出fastex.sh g/usr/bin/fastex.sh: 31: [g: not found并且它总是打开texstudio。如果我通过了也一样t

答案1

  1. 后面需要空格,if [因为[实际上是一个命令(如test),它读取它的参数(它可能由 shell 解释,但也可能不是)。 using[[确保使用 shell 的内部逻辑(更快,因为没有启动新进程)。尽管 shell 可能将[和解释test为内置函数,但可以使用 关闭此功能enable(然后真正启动一个新进程)。

  2. =是比较运算符里面然而,它也是其他地方的赋值运算符。虽然test=符合 POSIX,但只要不追求 POSIX 一致性,使用==(在 中识别[[) 似乎是一个合理的选择,因为它为 shell 上下文相关含义的不一致带来了更多的理智=

  3. exit 1- 为什么要有效地丢弃编辑器的返回值?要么完全忽略它,要么用exec编辑器替换脚本。


#!/bin/bash
editor=$1
if [[ "$1" == "g" ]]; then
    exec geany "$file.tex"
else
    linha=$(wc -l < "$file.tex")
    exec texstudio --line $linha  "$file.tex"
fi

答案2

if ["$1" = "g"]; then

[和中需要空格],因为它们像普通命令一样被解析。事实上,[这是一个普通命令(它是大多数 shell 中的内置命令)。

exit 1

为什么运行编辑器后退出并显示错误状态?返回状态 0 表示成功,其他值表示失败。您应该使脚本返回与编辑器相同的状态。正如所写的,您可以完全放弃exit:当 shell 到达脚本末尾时,它会终止脚本的执行并返回最后执行的命令的状态。

作为改进,您可以使用exec内置这样,您的脚本将终止并被编辑器替换,而不是将编辑器作为子进程运行。 (同一个进程继续运行,但它的代码切换到另一个程序的代码。)但是,如果您将其设为函数而不是脚本,则不要这样做!

构造case会更清楚地表达您的条件基于特定变量的值。

#!/bin/sh
editor=$1 file=$2
case "$editor" in
  g) exec geany "$file".tex;;
  *)
    linha=$(wc -l < "$file".tex)
    exec texstudio --line "$linha" "$file.tex";;
esac

相关内容