Bash:如果文件不存在则创建一个文件,否则检查它是否可写

Use*_*er1 24 linux bash

我有一个将写入输出文件的bash程序.此文件可能存在也可能不存在,但脚本必须检查权限并尽早失败.我无法找到一种优雅的方式来实现这一目标.这是我尝试过的.

set +e
touch $file
set -e

if [ $? -ne 0 ]; then exit;fi

我继续set -e这个脚本,所以如果任何一行都有错误,它就会失败.有没有更简单的方法来执行上述脚本?

Sor*_*gal 32

为什么复杂的事情?

file=exists_and_writeable

if [ ! -e "$file" ] ; then
    touch "$file"
fi

if [ ! -w "$file" ] ; then
    echo cannot write to $file
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

或者,更简洁,

( [ -e "$file" ] || touch "$file" ) && [ ! -w "$file" ] && echo cannot write to $file && exit 1
Run Code Online (Sandbox Code Playgroud)


Sie*_*geX 23

而不是检查$?不同的行,请立即检查返回值,如下所示:

touch file || exit
Run Code Online (Sandbox Code Playgroud)

只要您umask不限制写位被设置,您就可以依赖于返回值touch

  • 请注意,您不必使用"set + e",因为`-e`仅影响简单命令.此外,如果要打印错误消息,可以使用`touch file || {echo"无法写入文件">&2; 退出1}` (3认同)
  • 注意正确的语法是`touch'$ file"2>/dev/null || {echo"无法写入$ file">&2; 1号出口; }`.使用相同的shell对命令进行分组:`{list; 在列表后面需要一个结尾的分号(或换行符).请参阅http://www.gnu.org/software/bash/manual/bash.html#Command-Grouping我还将touch命令的错误重定向添加到`/ dev/null` (2认同)