考虑这个片段:
stop () {
echo "${1}" 1>&2
exit 1
}
func () {
if false; then
echo "foo"
else
stop "something went wrong"
fi
}
Run Code Online (Sandbox Code Playgroud)
通常当func被调用时它会导致脚本终止,这是预期的行为。但是,如果它在子shell中执行,例如在
result=`func`
Run Code Online (Sandbox Code Playgroud)
它不会退出脚本。这意味着调用代码每次都必须检查函数的退出状态。有没有办法避免这种情况?这set -e是为了什么?
我有一个具有以下格式的文本文件:
keyword value
keyword value
...
Run Code Online (Sandbox Code Playgroud)
其中关键字是单个单词,值是行尾之前的所有其他内容。我想从 shell 脚本中读取文件,方式是值(但不是关键字)进行 shell 扩展。
使用 sed 很容易匹配关键字和值部分
input='
keyword value value
keyword "value value"
keyword `uname`
'
echo "$input"|sed -e 's/^\([^[:space:]]*\)[[:space:]]\(.*\)$/k=<\1> v=<\2>/'
Run Code Online (Sandbox Code Playgroud)
产生
k=<keyword> v=<value value>
k=<keyword> v=<"value value">
k=<keyword> v=<`uname`>
Run Code Online (Sandbox Code Playgroud)
但问题是如何将 shell 命令嵌入到 sed 表达式的替换部分。在这种情况下,我希望替换为\1 `echo \2`.
根据开放集团的说法,
[t]返回实用程序将导致 shell 停止执行当前函数或点脚本。如果 shell 当前没有执行函数或点脚本,则结果未指定。
但是,如果您运行以下代码段
func () {
( return 1 )
return 0
}
func
echo $?
Run Code Online (Sandbox Code Playgroud)
输出是0(我尝试了 bash 和 dash,结果相同)。因此,这似乎return不会导致 shell 停止执行当前函数,这与 POSIX 标准相矛盾。我错过了什么吗?
我的印象是,在文件名中不允许使用的唯一角色是下/的,但我似乎并没有能够创造出其名称的文件中包含的字符,如*,\,",:,|,<或>无论是。例如,
$ echo "*"
> *
$ touch "*"
> touch: setting times of `*': No such file or directory
Run Code Online (Sandbox Code Playgroud)
我正在编写一个要求用户输入文件名的 shell 脚本,我想确保该名称没有任何无效字符。某处有清单吗?
更新:
我没有意识到我是在 FAT32 文件系统(USB 记忆棒)中这样做的,它不允许在文件名中包含“*”和其他字符。怪不得没用。对不起这是我的错!!