我知道最好用 来创建临时文件mktemp
,但是命名管道呢?
我更喜欢尽可能符合 POSIX 标准,但只有 Linux 是可以接受的。正如我在dash
.
在 POSIX Shell 中对变量进行 pre/post 递增时,这两个示例之间有什么区别。它们看起来会产生相同的结果,但它们的使用方式会不同吗?你什么时候更喜欢一个?
X=$((X+1))
: $((X=X+1))
Run Code Online (Sandbox Code Playgroud) 我知道以前对此的报道很少,但这些答案要么缺乏解释,要么不适用。
基本上在某些时候,我的脚本需要检查是否指定了文件,如果是,则稍后将用作输入。
[ -f "$1" ] && TINPUT="$1"
Run Code Online (Sandbox Code Playgroud)
足够简单......现在如果找不到文件或未指定文件,我TINPUT="-"
会告诉后面的命令读取标准输入。
这是我的问题......如果脚本在没有管道或没有指定文件的情况下运行,我如何让脚本因错误而死?
我正在使用 dash,Debian POSIX 兼容 shell,所以我不能使用 Bashisms。我也更喜欢使用列表,ifs
但大多数ifs
都可以写在列表中。
我正在使用getopts
所有需要高级选项解析的脚本,并且它与dash
. 我熟悉标准的基本getopts
用法,包括[-x]
和[-x OPTION]
。
是否可以解析这样的选项?
dash_script.sh FILE -x -z -o OPTION
## Or the inverse?
dash_script.sh -x -z -o OPTION FILE
Run Code Online (Sandbox Code Playgroud) 我试图在一个条件之后执行多个命令,例如......
[ $VAR ] || echo "Error msg" ; echo "exit"
Run Code Online (Sandbox Code Playgroud)
和逆
[ -z $VAR ] && echo "Error msg" ; echo "exit"
Run Code Online (Sandbox Code Playgroud)
我知道这不会按预期工作,实际上我以前知道如何执行但忘记了如何执行此操作。我完全了解许多替代方案,例如使用if
's 或通过()
和括起来{}
。使用()
将创建一个不会退出正在运行的脚本的子进程。使用{}
会起作用,但我知道存在一个更具可读性的替代方案。
我用 做了这个:
,它是完美的!!!我现在一辈子都记不起来了,而且我丢失了以前写过的剧本。
如果有人知道如何用:
's写这个,我真的很感激任何帮助!
我没有任何编写 .sh 文件的经验。我想从Volume Library运行这个应用程序的 pvm2raw 实用程序。
在 Ubuntu 10.10 中运行 build.sh 时出现以下错误。
build.sh 如下:
# make command
set mmfile=V3Makefile
set make="make -f $mmfile"
set rule=$1
if ($rule == "") set rule="all" // line 16
if ($rule == "deps") then
if ($HOSTTYPE == "iris4d") $make MAKEDEPEND="CC -M" OPTS="-DHAVE_CONFIG_H -DVIEWER_HAVE_DCMTK" TARGET=IRIX depend
if ($HOSTTYPE == "i386") $make MAKEDEPEND="c++ -M -I/usr/X11R6/include" OPTS="-DHAVE_CONFIG_H -DVIEWER_HAVE_DCMTK" TARGET=LINUX depend
Run Code Online (Sandbox Code Playgroud)
有什么问题吗?
编辑:我按照 jw013 的建议安装了 csh。现在我收到以下错误:
我该如何解决这个未定义的变量问题?