Bash中无法结合管道操作符正确执行hdfs dfs命令的问题
错误原因
三个写法的问题本质是对bash条件判断和HDFS命令的运行逻辑理解有误:
- 单引号包裹hdfs命令的写法:
[[ '字符串' ]]的逻辑是判断括号内的字符串是否非空,非空就返回真,这种写法根本没有实际执行hdfs命令,所以无论HDFS上文件是否存在,都会固定返回「file exists」。 - 去掉单引号直接把hdfs命令塞到
[[ ]]里的写法:[[ ]]是bash内置的条件判断语法,只支持内置的判断操作符(比如本地文件检测的-f、字符串比较等),不支持直接写入外部命令,所以会触发语法错误。 - 本地
-f判断能正常运行:因为-f是[[ ]]原生支持的本地文件系统检测参数,仅对本地路径生效,无法识别HDFS这类分布式文件系统的路径。
正确实现方案
HDFS路径的存在性判断不需要套[[ ]]结构,直接依赖hdfs dfs -test命令自身的退出码即可(命令执行成功返回0,失败返回非0,刚好可以衔接&&/||和if判断逻辑)。
基础单行写法:
hdfs dfs -test -f "$hdfs_path" && echo "file exists" || echo "file doesn't exist"
hdfs dfs -test常用检测参数:
-f:校验目标路径是否存在,且类型为文件-d:校验目标路径是否存在,且类型为目录-e:校验目标路径是否存在,不区分文件/目录类型-s:校验目标路径是否存在,且文件大小大于0
复杂多逻辑场景可以直接用if结构判断:
if hdfs dfs -test -f "$hdfs_path"; then echo "file exists" # 此处编写文件存在时的业务逻辑 else echo "file doesn't exist" # 此处编写文件不存在时的业务逻辑 fi
注意:不要给hdfs命令套多余的引号,也不要把外部执行命令放到[[ ]]结构中,[[ ]]仅用于bash内置的条件判断场景。
内容的提问来源于stack exchange,提问作者Gonzalo Etse
相关产品推荐
相关产品推荐

