我有一个 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