2014-02-07 69 views
1

的abc.txt作为星号的ksh变量

* This 
Data1 
Dat2 
* Comment 
data2 
data3 

当$线获得*第一个字符它不工作。它呼应垃圾。

我尝试了各种方法,但不能使它工作,如何检查“*”在KSH varaible

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 

感谢。

+0

使用一个方便的工具是shellcheck(HTTP:// WWW。 shellcheck.net/#)。它会提出各种关于如何改进脚本的基本提示。例如在'$ {line} >> stuff.txt'中围绕变量使用双引号。 – Gabe

回答

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 
+1

我发烧了,唯一的治疗方法就是多引号。 –

+0

...顺便说一句,'[[$ foo = $ bar]]'表达式左边的引号实际上是可选的;我把它们放在这里鼓励倾向于太多的引用,而不是太少,只要有疑问。 –