我想fastex
使用两个可能的参数(g
或t
)运行我的脚本,例如fastex g
.
根据我想打电话的论点geany $file
或texstudio $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
后面需要空格,
if [
因为[
实际上是一个命令(如test
),它读取它的参数(它可能由 shell 解释,但也可能不是)。 using[[
确保使用 shell 的内部逻辑(更快,因为没有启动新进程)。尽管 shell 可能将[
和解释test
为内置函数,但可以使用 关闭此功能enable
(然后真正启动一个新进程)。=
是比较运算符里面然而,它也是其他地方的赋值运算符。虽然test
和=
符合 POSIX,但只要不追求 POSIX 一致性,使用==
(在 中识别[[
) 似乎是一个合理的选择,因为它为 shell 上下文相关含义的不一致带来了更多的理智=
。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