6

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

例如:

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

**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。

4

3 回答 3

7

尝试这个:

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 <n>命令只是将左位置参数传递给 n 个位置的脚本。例如,如果您使用以下命令调用脚本:

./myscript 1 2 3 4

$1是“1”并且$2是“2”

但如果你是“3”并且shift 2是“4”。$1$2

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

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

while (( $# ))

获得相同的结果。

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

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

开始时更好的测试参数:

if (( $# % 2 ))
then
    echo "Provide an even number of parameters"
    exit 1
fi
于 2013-05-24T12:29:31.897 回答
4

切普纳 说:

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

柴坦亚 说:

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

这是一个快速示例:

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

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

于 2013-05-24T13:56:57.947 回答
0

@Zac 有正确的答案。

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

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

并在脚本中:

if [[ ! -d "$dir" ]]; then
    printf "$msg" "$dir"
于 2013-05-24T19:08:04.350 回答