首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文件或用户输入调用的脚本

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

Stack Overflow用户
提问于 2013-08-10 10:38:47
回答 3查看 194关注 0票数 0

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

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

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

代码语言:javascript
复制
if [$@ -eq "$NO_ARGS"]; then  
cat > temporary.txt; sed '/^$/d' <temporary.txt  
else  
sed '/^$/d' <$@  
fi

我哪里出问题了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-10 11:03:22

您需要[和]周围的空间。在bash中,[是一个命令,您需要它周围的空格才能这样解释它。

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

代码语言:javascript
复制
if ((!$#)); then
  cat > temporary.txt; sed '/^$/d' <temporary.txt
else
  sed '/^$/d' "$@"
fi

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

票数 0
EN

Stack Overflow用户

发布于 2013-08-10 12:43:08

这里有许多问题:

  1. 您需要在方括号和变量之间留出一个空格。
  2. 当使用字符串类型时,不能使用-eq,而是使用==。
  3. 在使用字符串比较时,需要使用双方括号。

因此,代码看起来应该是:

代码语言:javascript
复制
if [[ "$@" == "$NO_ARGS" ]]; then
cat > temporary.txt; sed '/^$/d' <temporary.txt
else
sed '/^$/d' <$@
fi

或者使用$#代替。

票数 0
EN

Stack Overflow用户

发布于 2013-08-10 19:26:37

与其强迫用户输入文件,不如将给定的文件强制为stdin:

代码语言:javascript
复制
#!/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'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18161062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档