首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >传递参数/参数?

传递参数/参数?
EN

Stack Overflow用户
提问于 2014-02-13 18:16:17
回答 3查看 98关注 0票数 0
代码语言:javascript
运行
复制
#!/bin/bash

traverse() {
local x=$1
if [ -d $x ]
then
lst=(`ls $x`)
for((i=${#lst[@]}; --i;)); do
    echo "${lst[i]}"
    done
else echo "not a directory"
fi
}

traverse

在执行程序时,我希望传递一个参数,如“/path/ to /this/目录/”,但只有在运行与bash脚本文件相同的目录下才能工作,而我传递的任何其他参数都被完全忽略。

脚本应该接受一个参数,并检查它是否是一个目录,如果它是一个目录,然后按降序列出所有文件/文件夹。如果没有显示错误消息。

代码有什么问题,谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-13 18:21:33

这是因为函数中的$1引用的是traverse的参数,而不是脚本的参数。

若要对每个参数运行一次函数,请使用

代码语言:javascript
运行
复制
for arg in "$@"   # "$@" is also the default, so you can drop the 'in ..'
do
  traverse "$arg"
done

如果将来希望将脚本的所有参数传递给函数,请使用

代码语言:javascript
运行
复制
myfunc "$@"

不过,这只是眼前的问题。其他问题包括不引用变量和使用ls、lst=(`ls $x`)的命令展开,而不是globs、lst=( "$x"/* )

票数 3
EN

Stack Overflow用户

发布于 2014-02-13 18:22:15

你不需要为此打电话给ls。您可以使用以下代码:

代码语言:javascript
运行
复制
traverse() {
    local x="$1"
    if [ -d "$x" ]; then
        arr=( "$x/"* )
        for ((i=${#arr[@]}; i>0; i--)); do
           echo "${arr[$i]}"
        done
    else
        echo "not a directory"
    fi
}
票数 3
EN

Stack Overflow用户

发布于 2014-02-13 18:34:00

“另一个人”的答案是正确的。它总是查看当前目录的原因是:

  1. 调用traverse时不带任何参数
  2. 遍历函数中的$1为空,因此$x为空。
  3. 因此,测试是[ -d ],当[被赋予一个参数时,如果参数不是空的,则返回成功。您的if命令总是执行"true“块,当x为空时,ls $x只是ls

在bash中使用[[ ... ]]:对于空参数它更聪明。否则,引用您的变量:

代码语言:javascript
运行
复制
$ x=; [ -d $x ] && echo always true || echo not a directory
always true
$ x=; [[ -d $x ]] && echo always true || echo not a directory
not a directory
$ x=; [ -d "$x" ] && echo always true || echo not a directory
not a directory
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21762316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档