【问题标题】:asterisk in ksh variableksh 变量中的星号
【发布时间】:2014-02-07 17:48:08
【问题描述】:

abc.txt 为

* This
Data1
Dat2
* Comment
data2
data3

当 $line 将 * 作为第一个字符时,它不起作用。它与垃圾相呼应。

我尝试了各种方法但无法正常工作,如何检查 ksh 变量中的“*”

while read line
do
        fchar=`echo "$line" | cut -c 1-1`
        #echo $fchar

    if [[ ${char} = "*" ]]; then
                continue
        fi

    if [[ ${char} = "#" ]]; then
                continue
        fi

        echo ${line} >> stuff.txt

done<$abc.txt

谢谢。

【问题讨论】:

  • 一个方便的工具是 shellcheck (shellcheck.net/#)。它将调出有关如何改进脚本的各种基本提示。例如在${line} &gt;&gt; stuff.txt 中的变量周围使用双引号。

标签: shell unix ksh


【解决方案1】:

需要更多报价。

echo "$line" >>stuff.txt

...不是

echo $line >>stuff.txt

...作为后者的字符串拆分和全局扩展行的内容,所以它用当前目录中的文件列表替换*,如果一个文件由那个替换foo[bar]foob名称存在等。


顺便说一句,您最好只打开一次stuff.txt,而不是每次要添加新行时都重新打开它。看起来像这样:

while read; do
  fchar=${REPLY:0:1}
  [[ "$fchar" = "*" ]] && continue
  [[ "$fchar" = "#" ]] && continue
  printf '%s\n' "$REPLY"
done >stuff.txt <abc.txt

顺便说一句,你也可以用 grep 简单地做到这一点:

grep -E -v '^[*#]' <abc.txt >stuff.txt

【讨论】:

  • 我发烧了,唯一的治疗方法就是多引用。
  • ...顺便说一下,[[ $foo = $bar ]] 表达式左侧的引号实际上是可选的;我把它们放在这里是为了鼓励在有疑问时倾向于使用太多的引用,而不是太少。
猜你喜欢
  • 2012-09-22
  • 2011-05-11
  • 2022-11-16
  • 1970-01-01
  • 2012-08-13
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多