相关疑难解决方法(0)

为什么使用 shell 循环处理文本被认为是不好的做法?

在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?

正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念可靠性易读性性能安全性

这个答案解释了可靠性易读性方面:

while IFS= read -r line <&3; do
  printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)

为了性能,从文件或管道读取时,while循环和读取非常慢,因为内置read shell一次读取一个字符。

怎么样的概念安全性方面?

shell text-processing

241
推荐指数
4
解决办法
5万
查看次数

什么时候需要双引号?

过去的旧建议是对任何涉及 a 的表达式加双引号$VARIABLE,至少在希望 shell 将其解释为单个项目的情况下,否则,内容中的任何空格$VARIABLE都会脱离 shell。

但是,我知道在较新版本的 shell 中,不再总是需要双引号(至少出于上述目的)。例如,在bash

% FOO='bar baz'
% [ $FOO = 'bar baz' ] && echo OK
bash: [: too many arguments
% [[ $FOO = 'bar baz' ]] && echo OK
OK
% touch 'bar baz'
% ls $FOO
ls: cannot access bar: No such file or directory
ls: cannot access baz: No such file or directory
Run Code Online (Sandbox Code Playgroud)

zsh,而另一方面,同样的三个命令成功。因此,基于此实验,似乎在 中bash可以省略 内部的双引号[[ ... ]],但不能省略内部 …

shell bash zsh shell-script quoting

147
推荐指数
1
解决办法
6万
查看次数

理解“IFS= read -r line”

我显然明白可以为内部字段分隔符变量添加值。例如:

$ IFS=blah
$ echo "$IFS"
blah
$ 
Run Code Online (Sandbox Code Playgroud)

我也明白这read -r line会将数据保存stdin到名为的变量line

$ read -r line <<< blah
$ echo "$line"
blah
$ 
Run Code Online (Sandbox Code Playgroud)

但是,命令如何分配变量值?它是否首先存储来自stdinto 变量的数据line,然后赋予lineto 的值IFS

bash shell-script

94
推荐指数
3
解决办法
10万
查看次数

if 条件中的括号:为什么我会收到没有空格的语法错误?

当脚本在一年的开始两天运行时,我使用下面的脚本将两天后移,并检查每个月的第一天和第二天,然后将后移两天。

if [$month="01"] && [$day="01"]; then
        date="$last_month/$yes_day/$last_year"
        fulldate="$last_month/$yes_day/$last_year"
else
        if [$month="01"] && [$day="02"]; then
                date="$last_month/$yes_day/$last_year"
                fulldate="$last_month/$yes_day/$last_year"
        else
                if [ $day = "01" ]; then
                        date="$last_month/$yes_day/$year"
                        fulldate="$year$last_month$yes_day"
                else
                        if [ $day = "02" ]; then
                                date="$last_month/$yes_day/$year"
                                fulldate="$year$last_month$yes_day"
                        else
                                date="$month/$yes_day/$year"
                                fulldate="$year$month$yes_day"
                        fi
                fi
        fi
fi
Run Code Online (Sandbox Code Playgroud)

但我的坏消息是收到以下错误消息

Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
Run Code Online (Sandbox Code Playgroud)

shell bash shell-script whitespace test

18
推荐指数
2
解决办法
7709
查看次数

标签 统计

bash ×3

shell ×3

shell-script ×3

quoting ×1

test ×1

text-processing ×1

whitespace ×1

zsh ×1