2016-11-15 44 views
0

我想打印域后可变分配到另一个topLeveldomain变量(example.com)bash的操作

$line = example.com 

domain =$line | cut -d. -f 1 
topLeveldomain = $line | cut -d. -f 2 

然而,当我尝试回声$域,它不会显示所需的值

test.sh: line 4: domain: command not found 
test.sh: line 5: topLeveldomain: command not found 
+0

请谨慎使用'=' – Djee

+1

之前的空格请参阅:http://www.shellcheck.net/ – Cyrus

回答

2

我建议:

line="example.com" 

domain=$(echo "$line" | cut -d. -f 1) 
topLeveldomain=$(echo "$line" | cut -d. -f 2) 
1

各地=删除空格:

line=example.com  # YES 
line = example.com # NO 

当你创建一个变量,不prepe ND $到变量名:

line=example.com  # YES 
$line=example.com # NO 

当使用管道,需要标准输出传递到下一个命令。不是方法,通常需要echo变量或cat文件:

echo $line | cut -d. -f1 # YES 
$line | cut -d. -f1   # NO 

使用$()语法来得到一个命令的输出到一个变量:

new_variable=$(echo $line | cut -d. -f1) # YES 
new_variable=echo $line | cut -d. -f1  # NO 
+0

请参阅:[正确的Bash和shell脚本可变大小](http://stackoverflow.com/a/ 673940/3776858) – Cyrus

+1

@Cyrus:谢谢你指出。更正(和学习)。 ^^ – Peque

1

正确的代码应该是:

line="example.com" 

domain=$(echo "$line" | cut -d. -f 1) 
topLeveldomain=$(echo "$line" | cut -d. -f 2) 

考虑到bash正确的语法:

variable=value 

,如果你要使用的变量的内容(有没有允许空白)

你必须添加一个领先$ 例如

echo $variable 
1

不需要外部工具对于这一点,只是这样做的bash

$ string="example.com" 

# print everything upto first de-limiter '.' 
$ printf "${string%%.*}\n"   
example 

# print everything after first de-limiter '.' 
$ printf "${string#*.}\n"   
com 
0

我宁愿用AWK:

domain="abc.def.hij.example.com" 
awk -F. '{printf "TLD:%s\n2:%s\n3:%s\n", $NF, $(NF-1), $(NF-2)}' <<< "$domain" 

输出

TLD:com 
2:example 
3:hij 

在上面的命令中,-F选项指定字段分隔符; NF是一个内置变量,用于保存输入字段的数量。

问题与您的代码

与您的代码的问题是由于无效的语法。

要设置一个变量的外壳,使用

VARNAME="value"

插入空格周围等号会导致错误。将值分配给变量时引用内容字符串的习惯是一种很好的习惯: 这样可以减少出错的几率。

请参阅Bash Guide for Beginners

0

这也适用:

line="example.com" 
domain=$(echo $line | cut -d. -f1) 
toplevel=$(cut -d. -f2 <<<$line) 
echo "domain name=" $domain 
echo "Top Level=" $toplevel 

你需要在一开始删除$从行,修正的空间和回声,以$线管切割值。也可以用$行进行剪切。