从文件或用户输入调用的脚本

时间:2013-08-10 10:38:47

标签: shell unix input

我正在尝试编写一个小脚本,既可以从文件中获取输入,也可以从用户处获取输入,然后从中删除任何空行。

我正在努力使它如果没有指定文件名,它将提示用户输入。也是将手动输入输出到文件然后运行代码或将其存储在变量中的最佳方法吗?

到目前为止,我有这个,但是当我用文件运行它时,它会在返回我想要的输出之前给出1行错误。错误显示./deblank: line 1: [blank_lines.txt: command not found

if [$@ -eq "$NO_ARGS"]; then  
cat > temporary.txt; sed '/^$/d' <temporary.txt  
else  
sed '/^$/d' <$@  
fi

我哪里错了?

4 个答案:

答案 0 :(得分:0)

尝试使用此

if [ $# -eq 0 ]; then  
  cat > temporary.txt; sed '/^$/d' <temporary.txt  
else  
  cat $@ | sed '/^$/d'  
fi

[$@之间需要一个空格,而$@的使用效果不佳。 $@表示所有参数,-eq用于比较数值。

答案 1 :(得分:0)

您需要[]周围的空格。在bash中,[命令,你需要在它周围留出空格,以便bash解释它。

您还可以使用(( ... ))检查是否存在参数。因此,您的脚本可以重写为:

if ((!$#)); then
  cat > temporary.txt; sed '/^$/d' <temporary.txt
else
  sed '/^$/d' "$@"
fi

如果您只想使用第一个参数,则需要说$1(而不是$@)。

答案 2 :(得分:0)

这里有很多问题:

  1. 您需要在方括号[]和变量之间留一个空格。

  2. 使用字符串类型时,不能使用-eq,而是使用==。

  3. 使用字符串比较时,您需要使用双方括号。

  4. 因此代码应如下所示:

    if [[ "$@" == "$NO_ARGS" ]]; then
    cat > temporary.txt; sed '/^$/d' <temporary.txt
    else
    sed '/^$/d' <$@
    fi
    

    或者使用$#代替。

答案 3 :(得分:0)

我强制将给定文件强制转换为stdin:

,而不是强制用户输入文件
#!/bin/bash

if [[ $1  &&  -r $1 ]]; then
    # it's a file
    exec 0<"$1"
elif ! tty -s; then
    : # input is piped from stdin
else
    # get input from user
    echo "No file specified, please enter your input, ctrl-D to end"   
fi

# now, let sed read from stdin
sed '/^$/d'