我试图在路径
中使用输入变量$1if [ -d "$1" ]; then
echo "The Directory Exists"
files=`find /cygdrive/c/2014-03-19 -name "*ellow.txt"`
for file in $files; do
etc...
现在,我不使用日期,而是使用$1(作为用户输入的变量)表示他们想使用的目录。/cygdrive/c/1美元。但我觉得这在后壁虱里行不通。有什么建议吗?我试着给$1赋一个变量名,但它仍然是字面上的问题。我怎么在这个路径中使用变量呢?
欢呼小伙子。
展开当然会在这些上下文中发生。也就是说,在正确使用find
时要小心;不寻常的文件名很容易被破坏,无论这些文件名是由软件错误还是恶意创建的。
if [ -d "/cygdrive/c/$1" ]; then
while IFS='' read -r -d '' file; do
something_with "$file"
done < <(find "/cygdrive/c/$1" -name '*ellow.txt' -print0)
else
echo "$1 is not a directory" >&2
fi
引用:
- http://mywiki.wooledge.org/BashPitfalls(条目1,关于为什么
$(find ...)
不够) - http://mywiki.wooledge.org/UsingFind(有替代方法)
- http://mywiki.wooledge.org/BashFAQ/024(关于
< <(...)
结构的需要)
是的,变量在反引号内展开:
> test=foo
> echo `echo $test`
foo
所以你的脚本应该像写的那样工作。
使用$()
通常被认为是更好的做法(除非您需要与不支持该构造的旧平台兼容)。这几乎等同于反引号,但它允许嵌套(并且更清晰一些)。
编辑:虽然这是问题的答案,查尔斯达菲已经指出了一些其他的问题与剧本,因为它的立场。一般来说,这些问题只影响具有"奇数"名称的文件(包括空格和globbing字符),但是如果您的脚本有任何可能在这样的上下文中运行,那么应该考虑这些问题。(如果这不仅仅是一个一次性的单会话函数定义,那么,是的,它有可能在您不期望的上下文中被重用。)