【问题标题】:For loop to find out if directory exists in unixFor循环找出目录是否存在于unix中
【发布时间】:2013-05-24 12:17:37
【问题描述】:

我想使用一个脚本来检查目录列表是否存在,同时它应该打印一些我正在发送的自定义消息。

例如:

我有一个脚本可以验证目录是否存在:

**check.sh**

for i in $*
   if [ -d "$i" ]; then
      echo Found <msg-i> directory.
   else
       echo <msg-i> directory not found.

现在我想这样调用这个脚本:

./check.sh $DIR1 msg1 $Dir2 msg2 $Dir3 msg3

因此,如果 DIR1 不存在,那么我想将消息显示为“未找到 msg1 目录”,同样对于 DIR2,我想显示“未找到 msg2 目录”。这里 msg1 和 msg2 是我想作为字符串传递的东西。如何做到这一点?我正在使用 bash shell。

【问题讨论】:

    标签: bash unix parameters


    【解决方案1】:

    试试这个:

    while [ -n "$1" ]
    do
        dir="$1"
        msg="$2"
        if [ -d "$dir" ]; then
            echo "$msg dir FOUND"
        else
            echo "$msg dir NOT FOUND"
        fi
        shift 2
    done
    

    shift &lt;n&gt; 命令只是将传递给脚本的 n 个位置的位置参数向左移动。 例如,如果您使用以下命令调用脚本:

    ./myscript 1 2 3 4

    $1 是“1”,$2 是“2”

    但如果您 shift 2$1 为“3”,$2 为“4”。

    这样循环每个循环消耗 2 个参数,直到 $1 参数为空字符串 (-n "$1")。

    while 条件可以更优雅地写成:

    while (( $# ))
    

    获得相同的结果。

    您也可以检查第二个参数 (while [ -n "$2" ]),但这会在用户提供奇数个参数时改变行为:

    • 在第一种情况下,将检查最后一个目录,但您会收到一条奇怪的消息,因为 $msg il empty
    • 在第二种情况下,您不会收到奇怪的消息,但不会检查最后一个目录

    开头更好的测试参数:

    if (( $# % 2 ))
    then
        echo "Provide an even number of parameters"
        exit 1
    fi
    

    【讨论】:

    • while 条件可以简单地为(( $# ))(测试位置参数的数量是否非零)。
    • 因为每个循环需要 2 个参数:while [[ "$2" ]]
    • 感谢@chepner:我在回答中报告了您的建议
    • 感谢@glennjackman 我在回答中报告了您的建议
    【解决方案2】:

    切普纳说:

    while 条件可以简单地为(( $# ))(测试位置参数的个数是否非零)。

    柴坦亚说:

    您好 Chepner,感谢您提供替代解决方案,您能否告诉我 while 条件实际上应该是什么样子才能使用 $# ,我尝试了不同的方法,但它不适合我。

    这是一个简单的示例:

    while (( $# ))
    do
       dir=$1
       msg=$2
       shift 2
       [...]
    done
    

    只要有任何命令行参数,while (( $# )) 就会为真。执行shift 两次会从列表中删除参数。当没有更多参数时,while 循环结束。

    【讨论】:

      【解决方案3】:

      @Zac 有正确答案。

      消息提示:使用printf 格式字符串:

      ./check.sh dir1 "can't locate %s directory"
      

      在脚本中:

      if [[ ! -d "$dir" ]]; then
          printf "$msg" "$dir"
      

      【讨论】:

      • 谢谢 Glenn,你能告诉我什么时候可以使用echo 命令,什么时候应该使用printf
      • echo 只是连接它的参数并输出它们。如果您需要对格式进行更细粒度的控制(例如,打印带有前导零的数字 printf %05d $n),可以使用 printf。 printf 还有一个很好的功能,如果参数多于占位符,它将重新使用格式字符串,因此printf "%s\n" "$@"for arg in "$@"; do echo "$arg"; done 的一个不错的快捷方式
      猜你喜欢
      • 2020-08-09
      • 1970-01-01
      • 2021-08-16
      • 2017-10-17
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多