当前位置:  开发笔记 > 编程语言 > 正文

在shell脚本中,for循环中的'if-else'是如何执行的?为什么它只为变量打印一次?

如何解决《在shell脚本中,for循环中的'if-else'是如何执行的?为什么它只为变量打印一次?》经验,为你挑选了1个好方法。

我写了一个shell片段,如下所示:

is_first=t
for f in "$path"/"m*"
do
    printf "%s\n" $f
    printf "%s\n" $is_first

    if [[ "$is_first" = "t" ]]; then
        is_first=f
        printf "%s\n" $is_first
    else
        printf "%s\n" $is_first
    fi

    printf "%s\n" $is_first
done

输出如下:

./merge_non-null
./merge_non-null_bak.sh
./merge_non-null.sh
t
f
f

我想知道,如何if-else在for循环中执行?它似乎只在第一个循环中运行,之后都被跳过.

另外,为什么printf "%s\n" $is_first只为第一个循环执行? 我期望的输出是(注意序列).我相信我错过了什么.对不起,如果它太愚蠢了.

./merge_non-null
t
f
f
./merge_non-null_bak.sh
f
f
f
./merge_non-null.sh
f
f
f

tripleee.. 6

你的报价不正确.在"m*"没有得到扩大,因为它是双引号,所以你遍历所有的文字串; 所以循环只执行一次.然后你错误地省略了循环中的引号,因此shell将参数中的通配符扩展为第一个printf.如果没有引号,printf使用此格式字符串会在展开的字符串中为每个标记打印一行; 所以你从循环的一次迭代中获得多个输出行printf.

通过正确的引用,您的脚本将成为

is_first=t
for f in "$path/m"*
do
    printf "%s\n" "$f"
    printf "%s\n" "$is_first"

    if [[ "$is_first" = "t" ]]; then
        is_first=f
        printf "%s\n" "$is_first"
    else
        printf "%s\n" "$is_first"
    fi

    printf "%s\n" "$is_first"
done

另请参见何时在shell变量周围包装引号?



1> tripleee..:

你的报价不正确.在"m*"没有得到扩大,因为它是双引号,所以你遍历所有的文字串; 所以循环只执行一次.然后你错误地省略了循环中的引号,因此shell将参数中的通配符扩展为第一个printf.如果没有引号,printf使用此格式字符串会在展开的字符串中为每个标记打印一行; 所以你从循环的一次迭代中获得多个输出行printf.

通过正确的引用,您的脚本将成为

is_first=t
for f in "$path/m"*
do
    printf "%s\n" "$f"
    printf "%s\n" "$is_first"

    if [[ "$is_first" = "t" ]]; then
        is_first=f
        printf "%s\n" "$is_first"
    else
        printf "%s\n" "$is_first"
    fi

    printf "%s\n" "$is_first"
done

另请参见何时在shell变量周围包装引号?

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有