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 Command Syntax

read -p "Prompt" variable1 variable2 variableN

Where,

  • -p "Prompt" : Display prompt to user without a newline.
  • variable1 : The first input (word) is assigned to the variable1.
  • variable2 : The second input (word) is assigned to the variable2.

Handling Input

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!

Examples

Try the following examples.

Multiple Input (number.sh)

#!/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"

Display Domain Owner Information

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

Timeout Input

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

Handling Passwords

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"

Handling multiple values

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.

$IFS

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,

  • $ - end of line i.e. newline
  • ^I$ - tab and newline

But how do I use $IFS and read command together?

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,

  • The read command reads input from $nameservers variable.
  • The default value of $IFS is used to assign values to three separate variables. Your input is broken into tokens using $IFS and assigned to three variables.
  • In other words, the IFS variable worked as token delimiter or separator.
  • The first token (ns1.nixcraft.net) is saved as the value of the first variable ($ns1)
  • The second token (ns2.nixcraft.net) is saved as the value of the second variable ($ns2).
  • The third token (ns3.nixcraft.net) is saved as the value of the third variable ($ns3).
  • To display the value of each variable use echo command or printf command as follows:
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

How do I change the IFS separator value?

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,

  • : - act as token separator on $pwd i.e. the contents of the IFS variable are used as token delimiters.
  • login - Field # 1 is generated using the first token and is saved as the value of the first variable ($login)
  • password - Field # 2 is generated using the second token and is saved as the value of the second variable ($password)
  • uid - Field # 3 and so on...
  • gid - Field # 4
  • info - Field # 5
  • home - Field # 6
  • shell - Field # 7

linux shell read command-Getting User Input Via Keyboard--ref的更多相关文章

  1. linux shell basic command

    Learning basic Linux commands Command Description $ ls This command is used to check the contents of ...

  2. Linux shell command学习笔记(一)

    Shell的种类有很多种,例如CSH,Bourne Shell,Korn Shell.在现在的大多数Linux发行版中,默认的Shell一般都是Bourne again shell(bash). &l ...

  3. Linux Shell系列教程之(十六) Shell输入输出重定向

    本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...

  4. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

  5. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

  6. 常用linux shell脚本记录

    遍历目录下所有的文件是目录还是文件 for file in ./* do if test -f $file then echo $file 是文件 fi if test -d $file then e ...

  7. LINUX SHELL脚本攻略笔记[速查]

    Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述 ...

  8. java使用Runtime.exec()运行windwos dos或linux shell命令

    使用Runtime.exec()运行windwos dos或linux shell命令,按实际情况具体测试     实例代码: package com.bookoo.test.command; imp ...

  9. Linux shell脚本基础学习详细介绍(完整版)二

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

  10. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

随机推荐

  1. ruby Mixin用法

    module My NA="China" attr:name attr:age def set_name(name) @name=name end def get_name ret ...

  2. 在电脑上装ubuntu12.04系统,内核文件是那个?

    在电脑上装ubuntu12.04系统,我们能看到的是根文件系统,那么内核文件(zlmage)是那个? ???

  3. 【HDOJ】3909 Sudoku

    DLX的应用,基本题,注意maxnode开大点儿. /* 3909 */ #include <iostream> #include <string> #include < ...

  4. hadoop学习笔记——基础知识及安装

    1.核心 HDFS  分布式文件系统    主从结构,一个namenoe和多个datanode, 分别对应独立的物理机器 1) NameNode是主服务器,管理文件系统的命名空间和客户端对文件的访问操 ...

  5. spring--处理器拦截器详解——跟着开涛学SpringMVC

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...

  6. Prism的IEventAggregator事件聚合器, 事件订阅发布, ViewModel之间的通讯

    WPF中时常会遇到ViewModel之间的通讯,ViewModel并不知道自己的View,但是一个View发生的更改需要通知另外一个View. 举一个例子,软件界面上有个人信息,打开一个界面更改用户的 ...

  7. [洛谷2397]yyy loves Maths VI

    题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你 题目描述 他让redbag找众数他还特意 ...

  8. 非递归实现先序遍历 java leecode 提交

    写完才知道自己学习都是似是而非啊,大家可以也在leecode上提交代码,纯手写,离开eclipse第一种方式:数据结构书上的,使用栈大概思路.1.不断将根节点的左孩子的左孩子直到为空,在这个过程入栈. ...

  9. bss段为什么要初始化,清除

    我们都知道bss段需要初始化,但是这是为什么呢? 通过浏览资料,我们都会发现,bss段是不会出现在程序下载文件(*.bin *.hex)中的,因为全都是0.如果把它们出现在程序下载文件中,会增加程序下 ...

  10. aix 文件大小相关查询

    一.aix中查看文件夹占用空间大小 du命令默认是显示当前目录下每个文件以及每个子目录以及下属文件的大小的 用du -sg 可看出当前文件夹的大小,包括文件夹下文件和文件夹(以G为单位):用du -s ...