在bash中使用变量目录名阻止我看到该目录中的文件

时间:2016-07-14 02:35:06

标签: bash shell scripting

当我尝试查看变量名目录中的文件列表时,输出只是我的输入。

read -e -p "Directory with images:" IMG_DIR
for file in $IMG_DIR/*; do echo "$file"; done
#if I input ~ at the terminal, ~/* and ~/.* is output

另一方面,如果目录是静态的,则输出正常:

for file in ~/{.,}*; do echo "$file"; done
#outputs all files in ~/ directory

知道为什么会这样,以及如何解决它?

2 个答案:

答案 0 :(得分:3)

BASH命令行中的扩展以定义的顺序发生,其中波形扩展在参数扩展之前。因此,不会扩展参数值中的~

您可以使用eval

触发代字号扩展
 for file in "$( eval echo "$IMG_DIR" )"/* ; do echo "$file"; done

以下是一个例子:

<强>脚本:

#!/bin/bash
read -e -p "Directory with images:" IMG_DIR
file "$IMG_DIR"
file "$( eval echo "$IMG_DIR" )"

<强>输出:

Directory with images:~
~: cannot open `~' (No such file or directory)
/home/username: directory

第一个命令file "$IMG_DIR"失败,第二个file "$(eval echo "$IMG_DIR")"成功。

答案 1 :(得分:3)

Dmitri Churabov's answer正确诊断了您的问题(简而言之:只有文字,未引用的~一直在扩展,永远不会存储在变量中) ,但出于安全原因,最好避免使用eval

相反,您可以使用参数展开滚动自己的代字号扩展:

read -e -p "Directory with images: " IMG_DIR
for file in "${IMG_DIR/#~/$HOME}"/*; do echo "$file"; done

如果它出现在/的开头($HOME),那么它会替换~变量#的值为文字$IMG_DIR值。