Deano
Deano

Reputation: 12190

bash assign variable to another after operation

I'm trying to print domain and topLeveldomain variables (example.com)

 $line = example.com

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

However when I try and echo $domain, it doesn't display desired value

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

Upvotes: 0

Views: 495

Answers (6)

George Vasiliou
George Vasiliou

Reputation: 6335

this also works:

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

You need to remove $ from line in the beginning, correct the spaces and echo $line in order to pipe the value to cut . Alternatively feed the cut with $line.

Upvotes: 0

Ruslan Osmanov
Ruslan Osmanov

Reputation: 21492

I would rather use AWK:

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

Output

TLD:com
2:example
3:hij

In the command above, -F option specifies the field separator; NF is a built-in variable that keeps the number of input fields.

Issues with Your Code

The issues with your code are due to invalid syntax.

To set a variable in the shell, use

VARNAME="value"

Putting spaces around the equal sign will cause errors. It is a good habit to quote content strings when assigning values to variables: this will reduce the chance that you make errors.

Refer to the Bash Guide for Beginners.

Upvotes: 0

Peque
Peque

Reputation: 14801

Remove spaces around =:

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

When you create a variable, do not prepend $ to the variable name:

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

When using pipes, you need to pass standard output to the next command. Than means, you usually need to echo variables or cat files:

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

Use the $() syntax to get the output of a command into a variable:

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

Upvotes: 1

Inian
Inian

Reputation: 85560

You don't need external tools for this, just do this in bash

$ string="example.com"

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

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

Upvotes: 1

mirokai
mirokai

Reputation: 125

The right code for this should be:

line="example.com"

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

Consider the right syntax of bash:

variable=value

(there are no blanks allowed)

if you want to use the content of the variable you have to add a leading $ e.g.

echo $variable

Upvotes: 1

Cyrus
Cyrus

Reputation: 88583

I suggest:

line="example.com"

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

Upvotes: 2

Related Questions