ref:http://bash.cyberciti.biz/guide/Getting_User_Input_Via_Keyboard
You can accept input from the keyboard and assign an input value to a user defined shell variable using read command.
read -p "Prompt" variable1 variable2 variableN
Where,
Create a script called greet.sh as follows:
#!/bin/bash read -p "Enter your name : " name echo "Hi, $name. Let us be friends!"
Save and close the file. Run it as follows:
chmod +x greet.sh ./greet.sh
Sample Outputs:
Enter your name : Vivek Gite Hi, Vivek Gite. Let us be friends!
Try the following examples.
#!/bin/bash # read three numbers and assigned them to 3 vars read -p "Enter number one : " n1 read -p "Enter number two : " n2 read -p "Enter number three : " n3 # display back 3 numbers - punched by user. echo "Number1 - $n1" echo "Number2 - $n2" echo "Number3 - $n3"
A shell script to display the Internet domain name owner information (domain.sh):
#!/bin/bash read -p "Enter the Internet domain name (e.g. nixcraft.com) : " domain_name whois $domain_name
You can time out read command using the -t option. It causes read to time out and return failure if a complete line of input is not read within TIMEOUT seconds. For example, if no input provided within 10 second, program will be aborted (domain2.sh):
#!/bin/bash read -t 10 -p "Enter the Internet domain name (e.g. nixcraft.com) : " domain_name whois $domain_name
The -s option causes input coming from a terminal do not be displayed on the screen. This is useful for password handling (readpass.sh):
#!/bin/bash read -s -p "Enter Password : " my_password echo echo "Your password - $my_password"
Consider the following example:
read -p "Enter directory to delete : " dirname echo "$dirname"
Sample outputs:
Enter directory to delete : foo bar /tmp/data foo bar /tmp/data
The user supplied three values instead of one. The string is now made of three different fields. All three words are assigned to dirname using $IFS internal field separator. The $IFS determines how shell recognizes fields.
To display default value of $IFS, enter:
echo "$IFS"
You will see a whitespace which is nothing but a space, a tab, and a newline (default). You can print actual values of IFS using the following command (see Here strings):
cat -etv <<<"$IFS"
Sample outputs:
^I$ $
Where,
Create a variable called nameservers and give it total 3 values as follows (note all values are separated by a whitespace):
nameservers="ns1.nixcraft.net ns2.nixcraft.net ns3.nixcraft.net"
Display the value of a variable nameservers with echo command or printf command:
echo "$nameservers"
OR
printf "%s" $nameservers
Now, you can simply split $nameservers using the read command as follows (see Here strings):
read -r ns1 ns2 ns3 <<< "$nameservers"
Where,
echo "DNS Server #1 $ns1" echo " #2 $ns2" echo " #3 $ns2"
OR use the printf command
printf "DNS Server #1 %s\n #2 %s\n #3 %s\n" $ns1 $ns2 $ns3
Sample outputs:
DNS Server #1 ns1.nixcraft.net #2 ns2.nixcraft.net #3 ns3.nixcraft.net
Consider the following /etc/passwd line:
gitevivek:x:1002:1002::/home/gitevivek:/bin/sh
Assign the above line to a variable called pwd:
pwd="gitevivek:x:1002:1002::/home/gitevivek:/bin/sh"
Save the Internal Field Separator to a variable called old:
old="$IFS"
Set the Internal Field Separator to a colon (i.e. change the Internal Field Separator):
IFS=:
Read $pwd and generate tokens using $IFS and store them into respective fields:
read -r login password uid gid info home shell <<< "$pwd" printf "Your login name is %s, uid %d, gid %d, home dir set to %s with %s as login shell\n" $login $uid $gid $home $shell
Sample outputs:
Your login name is gitevivek, uid 1002, gid 1002, home dir set to /home/gitevivek with /bin/sh as login shell
Finally, restore the Internal Field Separator value using $old:
IFS="$old"
Where,
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2730/viewspace-3118771/ ,如需转载,请注明出处,否则将追究法律责任。