对于cat
可以用空文件替换空参数的命令,可以使用标准 shell 默认替换语法:
cat "${file1:-/dev/null}" "${file2:-/dev/null}" "${file3:-/dev/null}"
或者,您可以通过管道(如下所示)或通过进程替换从存在的参数创建连接的输出流:
{ [[ -n "$file1" ]] && cat "$file1";
[[ -n "$file2" ]] && cat "$file2";
[[ -n "$file3" ]] && cat "$file3"; } | awk ...
这可以用一个效用函数来简化:
cat_if_named() { [[ -n "$1" ]] && cat "$1"; }
在构建新文件的特殊情况下cat
,您可以执行一系列附加操作:
# Start by emptying or creating the output file.
. > output_file
cat_if_named "$file1" >> output_file
cat_if_named "$file2" >> output_file
cat_if_named "$file3" >> output_file
如果您需要保留单个参数 - 例如,如果要将列表传递给grep
,它将打印文件名以及匹配项 - 您可以构建一个参数数组,仅选择存在的参数:
args=()
[[ -n "$file1" ]] && args+=("$file1")
[[ -n "$file2" ]] && args+=("$file2")
[[ -n "$file3" ]] && args+=("$file3")
使用 bash 4.3 或更高版本,您可以使用 nameref 制作实用函数来执行上述操作,这几乎可以肯定是解决该问题的最紧凑和通用的解决方案:
non_empty() {
declare -n _args="$1"
_args=()
shift
for arg; do [[ -n "$arg" ]] && _args+=("$arg"); done
}
例如:
non_empty my_args "$file1" "$file2" "$file3"
grep "$pattern" "${my_args[@]}"