Bash: How to use read with conditions & loops


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Bash: How to use read with conditions & loops
# 1  
Old 10-12-2016
Bash: How to use read with conditions & loops

Hello,

Below I try to control that the input is good an IP :
Code:
#!/bin/bash

cp /home/scripts/choice_interfaces.txt /home/scripts/interfaces.txt
chmod 644 /home/scripts/interfaces.txt

echo -e "Please enter the network informations into the /etc/network/interfaces file, complete them below :\n"

sed -n '1,10p' choice_interfaces.txt

printf "address " ; read -r address
if [[ $address =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
printf "network " ; read -r network
printf "netmask " ; read -r netmask
printf "broadcast " ; read -r broadcast
printf "gateway " ; read -r gateway
else
echo "$address doesn't correct"
fi
sed -i '12s/$/\n address '$address'/' interfaces.txt
sed -i '13s/$/\n network '$network'/' interfaces.txt
sed -i '14s/$/\n netmask '$netmask'/' interfaces.txt
sed -i '15s/$/\n broadcast '$broadcast'/' interfaces.txt
sed -i '16s/$/\n gateway '$gateway'/' interfaces.txt

mv /home/scripts/interfaces.txt /etc/network/interfaces

I try a loop.. :
Code:
printf "address " ; read -r address
while [[ $address =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; do
printf "address " ; read -r address
done 
I wanted that the user be invited to type until his input is good
printf "network " ; read -r network 
printf "netmask " ; read -r netmask
printf "broadcast " ; read -r broadcast
printf "gateway " ; read -r gateway

I do an example that I will wish, because I row.. :
Code:
#!/bin/bash

cp /home/scripts/choice_interfaces.txt /home/scripts/interfaces.txt
chmod 644 /home/scripts/interfaces.txt

echo -e "Please enter the network informations into the /etc/network/interfaces file, complete them below :\n"

sed -n '1,10p' choice_interfaces.txt

while[[ $address $network $netmask $broadcast $gateway  =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] || [[-z $address $network $netmask $broadcast $gateway]]; do (I found it on google to test if the input is empty but Its not working)
printf "address " ; read -r address
printf "network " ; read -r network
printf "netmask " ; read -r netmask
printf "broadcast " ; read -r broadcast
printf "gateway " ; read -r gateway
done

sed -i '12s/$/\n address '$address'/' interfaces.txt
sed -i '13s/$/\n network '$network'/' interfaces.txt
sed -i '14s/$/\n netmask '$netmask'/' interfaces.txt
sed -i '15s/$/\n broadcast '$broadcast'/' interfaces.txt
sed -i '16s/$/\n gateway '$gateway'/' interfaces.txt

#mv /home/scripts/interfaces.txt /etc/network/interfaces1

Thanks in advance SmilieSmilie I hope I was enough clear Smilie
# 2  
Old 10-12-2016
You could write a function to prompt for and set your IP address like this:

Code:
#!/bin/bash
fetchip() {

    printf "%s: " "$1"
    read
    while ! [[ "$REPLY" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; do
      printf "Invalid $1 IP address - Please re-enter\n%s: " "$1"
      read
    done

    printf -v $1 "%s" "$REPLY"
}

fetchip network
fetchip netmask
fetchip broadcast
fetchip gateway

echo "-----------------"
echo "Network=$network"
echo "Netmask=$netmask"
echo "Broadcase=$broadcast"
echo "gateway=$gateway"

This User Gave Thanks to Chubler_XL For This Post:
# 3  
Old 10-13-2016
You can have more than one line in a while/until condition.
The following uses a code block between until...do plus another explicit code block within {...}
Code:
#!/bin/bash
fetchip() {
  printf "%s: " "$1"
  until
    read
    [[ "$REPLY" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] &&
    {
    IFS=. read ip1 ip2 ip3 ip4 <<< "$REPLY"
    [[ $ip1 -le 255 && $ip2 -le 255 && $ip3 -le 255 && $ip4 -le 255 ]]
    }
  do
    printf "Invalid $1 IP address - Please re-enter\n%s: " "$1"
  done
}
...

This User Gave Thanks to MadeInGermany For This Post:
# 4  
Old 10-13-2016
Hi, thanks to you both for the solutions SmilieSmilie I make a script for a basic installation of a servers, here the beginning, if anyone is interested and if you have some critics or advices don't hesitate, it will be beneficial to me :
1st step, I have created a file with a template from an interface file, named choice_interfaces.txt :
Code:
#--------------------------------------------------------------
# The loopback network interface
#--------------------------------------------------------------

auto lo
iface lo inet loopback

#--------------------------------------------------------------
# Eth0
#--------------------------------------------------------------
auto eth0
iface eth0 inet static

2nd step, I have created another file with my script :
Code:
#!/bin/bash

#!/bin/bash
fetchip() {
  printf "%s: " "$1"
  until
    read
    [[ "$REPLY" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] &&
    {
    IFS=. read ip1 ip2 ip3 ip4 <<< "$REPLY"
    [[ $ip1 -le 255 && $ip2 -le 255 && $ip3 -le 255 && $ip4 -le 255 ]]
    }
  do
    printf "Invalid $1 IP address - Please re-enter\n%s: " "$1"
  done
}

cp /home/scripts/choice_interfaces.txt /home/scripts/interfaces.txt
chmod 644 /home/scripts/interfaces.txt

echo -e "Please enter the network informations into the /etc/network/interfaces file, complete them below :\n"

sed -n '1,10p' choice_interfaces.txt

fetchip address
fetchip network
fetchip netmask
fetchip broadcast
fetchip gateway

sed -i '12s/$/\n address '$address'/' interfaces.txt
sed -i '13s/$/\n network '$network'/' interfaces.txt
sed -i '14s/$/\n netmask '$netmask'/' interfaces.txt
sed -i '15s/$/\n broadcast '$broadcast'/' interfaces.txt
sed -i '16s/$/\n gateway '$gateway'/' interfaces.txt

#mv /home/scripts/interfaces.txt /etc/network/interfaces

on this, see you later SmilieSmilie

Last edited by Arnaudh78; 10-13-2016 at 02:32 PM..
# 5  
Old 10-13-2016
A few comments:
- the files' path seems to be used inconsistently - either use absolute paths on file names, or cd into the working directory at the start.
- where do you store and/or use fetchip's result/output?
- those many sed commands could be collected into one single one only.
- the keywords you use for the sed commands don't seem to show up in the choice_interfaces.txt.
This User Gave Thanks to RudiC For This Post:
# 6  
Old 10-13-2016
Quote:
Originally Posted by RudiC
A few comments:
- the files' path seems to be used inconsistently - either use absolute paths on file names, or cd into the working directory at the start.
- where do you store and/or use fetchip's result/output?
- those many sed commands could be collected into one single one only.
- the keywords you use for the sed commands don't seem to show up in the choice_interfaces.txt.
thank you, I noted, I'll think about it Smilie
# 7  
Old 10-13-2016
You need a trick that stuffs the result into the variable name that has been passed to the function as an argument.
Like Chubler_XL's
Code:
  printf -v "$1" "%s" "$REPLY"

Or with read:
Code:
fetchip() {
  until
    read -p "$1: "
    [[ "$REPLY" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] &&
    {
    IFS=. read ip1 ip2 ip3 ip4 <<< "$REPLY"
    [[ $ip1 -le 255 && $ip2 -le 255 && $ip3 -le 255 && $ip4 -le 255 ]]
    }
  do
    echo "Invalid $1 IP address - Please re-enter"
  done
  # Read the $REPLY into the given variable name
  read "$1" <<< "$REPLY"
}

For consistent file naming you best define a variable, like
Code:
iffile=interfaces.txt

and then use $iffile.
With sed you can append to a certain line number (or to a line with a certain content)
Code:
sed -i '
12a\
 address '$address'\
 network '$network'\
 netmask '$netmask'\
 broadcast '$broadcast'\
 gateway '$gateway'
' "$iffile"

If this is at the end of the file, the shell can simply append a multi-line string to the file:
Code:
echo "\
 address $address
 network $network
 netmask $netmask
 broadcast $broadcast
 gateway $gateway" >> "$iffile"

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Loops & Variable

I am using this code: for e in {1..14} do awk '{gsub(/^.*GGGGGG|TTTTT.*$/,"",$0)} 1' $e.1 > ${e}.2 done However, in the second loop instead of GGGGGG|TTTTT, I should use AAAAAA|CCCCCC. For third loop CCAAAA|CCCCAA, so on and so forth. Is there any way to accomplish this without writing... (20 Replies)
Discussion started by: Xterra
20 Replies

2. Shell Programming and Scripting

[Bash] Read History function & Read Arrowkeys

Hi. How can I create a history function? (By "read" command or so) & How can I configure a read command so that the arrow keys are not displayed so funny? (^[[A) Thanks in advance. (4 Replies)
Discussion started by: sinnlosername
4 Replies

3. Shell Programming and Scripting

GNU & BSD Makefile Directives & Conditions Compatibility

Firstly, I would like to apologize if this is not the appropriate sub-forum to post about GNU/BSD makefile scripting. Though my code is in C++, because I am focusing on the makefile I thought it would go better in shell scripting. Please correct me if I am wrong. Secondly, I am not interested in... (0 Replies)
Discussion started by: AntumDeluge
0 Replies

4. Shell Programming and Scripting

bash loops

hello i'm writing a script and I want to use a for loop inside a while loop as following: while read line; do echo $line for i in $vrm; do echo $i done done < './contacts' when i use just the while loop it prints the lines from file ./contacts just... (13 Replies)
Discussion started by: vlm
13 Replies

5. UNIX for Dummies Questions & Answers

Faster than nested while read loops?

Hi experts, I just want to know if there is a better solution to my nested while read loops below: while read line; do while read line2; do while read line3; do echo "$line $line2 $line3" done < file3.txt done < file2.txt done < file1.txt >... (4 Replies)
Discussion started by: chstr_14
4 Replies

6. Shell Programming and Scripting

PHP read large string & split in multidimensional arrays & assign fieldnames & write into MYSQL

Hi, I hope the title does not scare people to look into this thread but it describes roughly what I'm trying to do. I need a solution in PHP. I'm a programming beginner, so it might be that the approach to solve this, might be easier to solve with an other approach of someone else, so if you... (0 Replies)
Discussion started by: lowmaster
0 Replies

7. Shell Programming and Scripting

Bash Script to Read & Write on different directories

Hi, root@server] df -h 121G 14G 101G 12% /home 147G 126G 14G 91% /backup We having our site files and images are storing in /backup/home/user/files/ through symbolic link created in /home directory pointing in /backup directory as following. root@server] cd /home... (1 Reply)
Discussion started by: mirfan
1 Replies

8. Shell Programming and Scripting

multiple conditions in if using && operator

VARIABLE="project" if && ] then echo "VARIABLE is not empty" fi this is not working what is wrong in the syntax?? (2 Replies)
Discussion started by: codeman007
2 Replies

9. Shell Programming and Scripting

scripting headache... loops & variables

Surely there's an easier way to do this, lets see if anyone knows! I am new to scripting so go easy on me! I have the following script and at the moment it doesn't work and I believe the problem is that I am using a while loop within a while loop. When I run the script using sh -x I can see... (6 Replies)
Discussion started by: StevePace
6 Replies

10. Shell Programming and Scripting

if statement with two conditions -e, &&

Wow I'm so zoned out I don't even know if I posted this question up already (I couldn't find it in my book marks or in "yesterday's" post). My question is, I'm writing a korn script that does something like the following, but I don't yet completely understand the syntax. I need to check that... (16 Replies)
Discussion started by: yongho
16 Replies
Login or Register to Ask a Question