0

我正在尝试编写一个从文件或用户获取输入的小脚本,然后它会删除其中的任何空行。

我正在尝试这样做,以便如果没有指定文件名,它将提示用户输入。将手动输入输出到文件然后运行代码或将其存储在变量中的最佳方法是什么?

到目前为止,我有这个,但是当我用一个文件运行它时,它会在返回我想要的输出之前给出 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

4 回答 4

0

尝试使用这个

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

[和之间需要一个空间$@,你的使用$@不好。$@表示所有参数,-eq用于比较数值。

于 2013-08-10T11:01:38.537 回答
0

[您需要在和周围留出空格]。在 bash 中,[是一个命令,您需要围绕它的空格让 bash 解释它。

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

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

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

于 2013-08-10T11:03:22.967 回答
0

这里有多个问题:

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

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

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

所以代码应该是这样的:

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

或者使用 $# 代替。

于 2013-08-10T12:43:08.823 回答
0

我不会强制用户输入文件,而是强制给定文件到标准输入:

#!/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'
于 2013-08-10T19:26:37.110 回答