当我尝试查看变量名目录中的文件列表时,输出只是我的输入。
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
知道为什么会这样,以及如何解决它?
答案 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
值。