Bash脚本,使用变量



我试图在路径

中使用输入变量$1
if [ -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字符),但是如果您的脚本有任何可能在这样的上下文中运行,那么应该考虑这些问题。(如果这不仅仅是一个一次性的单会话函数定义,那么,是的,它有可能在您不期望的上下文中被重用。)

相关内容

  • 没有找到相关文章

最新更新