我写了一个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变量周围包装引号?
你的报价不正确.在"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变量周围包装引号?