如何在 CLI 中将文本文件中的命令解析为 bash 脚本

如何在 CLI 中将文本文件中的命令解析为 bash 脚本

我有一个 bash 脚本,它通过以下方式获取数据:

$ ./script.sh var1 var2 var3

我想要的是文本文件中的变量与我在命令行中键入的格式相同。

输入.txt

var1 var2 var3

我想以某种方式将此 txt 提供给命令行中的 bash 脚本,而不是在 bash 脚本中:

./script.sh input.txt

这怎么可能?

更新:

这是我的脚本:

#!/bin/bash

DOMAINS=( '.com' '.biz' )

VALUE=$(<input.txt)
INPUT=(`echo "$VALUE"`)

ELEMENTS=${#DOMAINS[@]}

while (( "$#" )); do

  for (( i=0;i<$ELEMENTS;i++)); do
      whois $1${DOMAINS[${i}]} | grep --perl-regexp --text --null --only-matching --quiet 'Creation Date'
    if [ $? -eq 0 ]; then
        echo -e "$1${DOMAINS[${i}]}\tregistered\t"
    else
        echo -e "$1${DOMAINS[${i}]}\tavailable\t"
    fi
  done

shift

done

正如您所看到的,我也尝试在脚本中实现,但我不是程序员。

完美的解决方案是从 input.txt 中删除使用过的数据。因此,如果它从 input.txt 读取 var1,则将其从那里删除!这个可以解决吗?

答案1

有多种方法可以做到这一点。如果您的脚本不需要采用多个参数,只需使用循环while来读取文件即可。我还会删除一些不必要的选项(使用时grep不需要,你永远不会看到输出;你不需要 perl 正则表达式,因为你没有使用它们的任何功能,而且你不需要因为您不会解析二进制文件)并使用较短的选项名称以简洁起见。--only--matching--quiet--text

因此,脚本的工作(并略有改进)版本将是:

#!/bin/bash

DOMAINS=( '.com' '.biz' )

while read input; do
    for (( i=0;i<${#DOMAINS[@]};i++)); do
    whois "$input${DOMAINS[$i]}" | grep -q 'Creation Date'
    if [ $? -eq 0 ]; then
            echo -e "$input${DOMAINS[$i]}\tregistered\t"
    else
            echo -e "$input${DOMAINS[$i]}\tavailable\t"
    fi
    done
done < "$1"

如果您在包含以下内容的文件上运行该命令:

google
foogle

你得到:

$ foo.sh file
google.com  registered  
google.biz  available   
gaagle.com  registered  
gaagle.biz  available   

相关内容