deh*_*ker 0 linux bash shell for-loop if-statement
我写了一个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
Run Code Online (Sandbox Code Playgroud)
输出如下:
./merge_non-null
./merge_non-null_bak.sh
./merge_non-null.sh
t
f
f
Run Code Online (Sandbox Code Playgroud)
我想知道,如何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
Run Code Online (Sandbox Code Playgroud)
你的报价不正确.在"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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
42 次 |
| 最近记录: |