shell之变量与read
环境变量 set 环境变量可供shell以外的程序使用
shell变量 env shell变量仅供shell内部使用
set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell有不同的私有变量 bash,ksh,csh每中shell私有变量都不一样。
env:显示(设置)用户变量。
export:显示(设置)当前导出成用户变量的shell变量。
总结:linux 分 shell变量(set),用户变量(env),shell变量包含用户变量,export是一种命令工具,是显示那些通过export命令把shell变量中包含的用户变量导入给用户变量的那些变量.
使用unset命令来清除环境变量,注意set env export设置的变量,都可以用unset来清除的
目录栈的变量 DIRSTACK
控制提示符的变量 PROMPT_COMMAND
15:59:36 39 ~:#echo $PROMPT_COMMAND
printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"
16:01:20 40 ~:#PROMPT_COMMAND="date +%H%M"
16:03:11 44 ~:#uptime
16:03:16 up 7 days, 7:02, 1 user, load average: 0.00, 0.00, 0.00
16:04:00 49 ~:#date
Mon May 18 16:16:11 CST 2015
变量赋值
变量的赋值有五种:使用read命令,直接赋值,使用命令行参数,使用命令行的输出结果,从文件读取。
1 先说一下从read命令吧:(主要是在需要交互时使用)
Read命令是系统内置命令,语法格式为:
read 变量1 变量2
当Shell脚本执行到read命令时,将暂停脚本的执行并等待键盘的输入,当用户输入完毕并且敲下回车之后,将完成赋值操作,脚本继续执行。
Read指令的规则:
多个数据或变量之间用空格隔开
若变量个数与数据个数相等时,对应取值
若变量个数大于数据个数时,没有输入数据的变量取空值
若变量个数小于数据个数时,将多余的数据赋给最后一个变量(也就是把空格当成字符串处理)
例子:
#!/bin/bash
echo -n “ please enter your name” //-n 表示用户输入和提示信息在同一行
read name
echo “your name is $name”
#!/bin/bash
echo “Please enter your first name and last name :”
read first last
echo “your first name is $first”
echo “your last name is $last”
2 第二种赋值方法就是直接给变量赋值(这种赋值方法主要是在不需要交互时,并且参数不需要修改时使用)
例如:name=xiaosu
gender=man
3 第三种赋值方法是使用命令行参数赋值。(这种赋值方法是参数需要经常变化,并且不需要交互时使用)
这种赋值方法,也就是直接在命令后面跟参数,然后系统用$1来引用第一个参数。
a="$PWD"
echo $a
filename=$1
if [ -e "${filename}" ]
[root@-shiyan sh]# cat >myls
a=$
if [ -f $a ]
then
echo "$a is file"
else echo "unknown"
fi
[root@-shiyan sh]# ./myls fr
fr is file
[root@-shiyan sh]# ./myls awk
unknown [root@-shiyan sh]# cat >myls
while read $
do
echo "$1"
shift
done
###一直循环,除非按ctrl+c才能退出。
[root@-shiyan sh]# ./myls fr for his fr for his
4 第四种方法是利用命令的输出结果赋值(这种赋值方法可以直接处理上个命令产生的数据)
在Shell程序中,可以将一个命令的输出结果来当做变量,不过需要在赋值语句中使用反引号
例如currentdir=`pwd`
echo $currentdir
5 最后一种赋值方法是从文件中读入数据
这种方式就适合处理大批量的数据,直接把相应的数据写入文件,然后运行脚本即可。
通常是通过while循环一行行读入数据,即每循环一次,就从文件中读取一行数据,直到读取到文件的结尾。
例如:
#!/bin/bash
ls *.sh >execfile
while read LINE
do
chmod a+x $LINE
done <execfile
这个脚本使用了while..do..done 结构,最后一行表示从文件execfile读取数据。while read LINE表示 每次循环读入一行数据并赋值给变量LINE。
6 变量的输出
最简单的方法就是使用echo
如果想输出格式化的字符串,就需要使用printf,用法和C语言类似
printf 命令的格式说明符
\” 输出双引号
\\ 输出反斜杠
\a 响铃
\n 换行
\r 回车
位置参数
$1直到$N,大于10,要用${10}表示。
特殊参数
$! $@ $# $$ $* $? $0 $- $_
# vi variable
#!/bin/sh
echo "number:$#"
echo "scname:$0"
echo "first:$1"
echo "second:$2"
echo "argume:$@"
echo "show parm list:$*"
echo "show process id:$$"
echo "show precomm stat:$?"
# chmod +x variable
# ./variable aa bb
number:2
scname:./variable
first:aa
second:bb
argume:aa bb
show parm list:aa bb
show process id:24544
show precomm stat:0
通过显示结果可以看到:
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
该变量包含了所有输入的命令行参数值。如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm
此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
$! 显示最近运行的后台进程ID
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
$- 记录着当前设置的shell选项,himBH是默认值,你可以通过 set 命令来设置或者取消一个选项配置。
[root@host02 rc0.d]# echo $-
himBHP
[root@250-shiyan /]# cd
[root@250-shiyan ~]# echo $_
cd
[root@250-shiyan ~]# ls
anaconda-ks.cfg c cccc chpa1.sh install.log install.log.syslog sh
[root@250-shiyan ~]# echo $_
--color=auto
[root@-shiyan sh]# cat vari1
#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "print each param from \$*"
for var in $*
do
echo "$var"
done
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done
[root@-shiyan sh]# ./vari1 ei ei fefo fefw
$*= ei ei fefo fefw
"$*"= ei ei fefo fefw
$@= ei ei fefo fefw
"$@"= ei ei fefo fefw
print each param from $*
ei
ei
fefo
fefw
print each param from $@
ei
ei
fefo
fefw
print each param from "$*"
ei ei fefo fefw
print each param from "$@"
ei
ei
fefo
fefw
[root@-shiyan sh]#
bash-read
在read命令行中也可以不指定变量.如果不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中。
环境变量REPLY中包含输入的所有数据,可以像使用其他变量一样在shell脚本中使用环境变量REPLY.
[root@localhost ~]# read
fjdksfief
[root@localhost ~]# echo $REPLY
fjdksfief
[root@localhost ~]# read
SKFIEFJEIFFEIWOEFJ
[root@localhost ~]# echo $REPLY
SKFIEFJEIFFEIWOEFJ 计时输入.
使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个计时器。
-t选项指定read命令等待输入的秒数。当计时满时,read命令返回一个非零退出状态;
#!/bin/bash
if read -t 5 -p "please enter your name:" name
then
echo "hello $name ,welcome to my script"
else
echo "sorry,too slow"
fi
exit 0
除了输入时间计时,还可以设置read命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。
#!/bin/bash
read -n1 -p "Do you want to continue [Y/N]?" answer
case $answer in
Y | y)
echo "fine ,continue";;
N | n)
echo "ok,good bye";;
*)
echo "error choice";;
esac
exit 0
该例子使用了-n选项,后接数值1,指示read命令只要接受到一个字符就退出。只要按下一个字符进行回答,read命令立即接受输入并将其传给变量。无需按回车键。 -p选项,就可以不用echo了
[root@localhost ~]# read -p "please input:" a;if [ $a -eq ]; then echo ; else echo ; fi
please input: [root@localhost ~]# read -p "please input:" a;if [ $a -eq ]; then echo ; else echo ; fi
please input: [root@localhost ~]# read -p "please input:" a;if [ $a -eq ]; then echo ; else echo ; fi
please input: [root@localhost ~]# read -p "please input:" a;if [ $a -eq ]; then echo ; else echo ; fi
please input:d
-bash: [: d: integer expression expected -s选项不显示输入
默读(输入不显示在监视器上)
有时会需要脚本用户输入,但不希望输入的数据显示在监视器上。典型的例子就是输入密码,当然还有很多其他需要隐藏的数据。
-s选项能够使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是 read命令将文本颜色设置成与背景相同的颜色)。
[root@localhost ~]# read -s a;if [ $a -eq 1 ]; then echo 2; else echo 4; fi
4
[root@localhost ~]# read -s a;if [ $a -eq 1 ]; then echo 2; else echo 4; fi
2 还可以使用read命令读取Linux系统上的文件。
每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。
读取文件的关键是如何将文本中的数据传送给read命令。
最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的 while命令
cat 命令的输出作为read命令的输入,read读到的值放在line中
[root@localhost ~]# cat test
qqqq
www
eee
e
e
e
rrrtt
[root@localhost ~]# cat 123
#!/bin/bash
count=1
cat test | while read line
do
echo "Line $count:$line"
count=$[ $count + 1 ]
done
echo "finish"
[root@localhost ~]# source 123
Line 1:qqqq
Line 2:www
Line 3:eee
Line 4:e
Line 5:e
Line 6:e
Line 7:rrrtt
finish
shell之变量与read的更多相关文章
- shell与变量的声明的操作
1.给命令起别名:alias 执行下面命令后,可以使用dir代替ls –l 命令,显示目录中的文件详细信息: 还可以用一个别名表示几个命令 的结合: 2.ps:显示当前登录会话的所有活动进程: 3.更 ...
- 【Linux】之shell特殊变量整理
目录 1. 特殊变量列表 2. 特殊说明 在shell中变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即p ...
- (转载)shell变量基础—shell自定义变量
(转载)http://see.xidian.edu.cn/cpp/html/1494.html 一.Shell定义变量需要遵循的规则 Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下 ...
- shell基础——变量定义
快速参考: 变量定义格式: 变量名=值 str1="hello world" # define a string var str2=hello # define a string ...
- shell的变量处理
shell的变量处理 一.删除 删除(删除某一段) # 从前向后删除 % 从后向前删除 删除(删除某一部分) $(var:nu1:nu2) nu1表示开始位置 nu2表示删除长度 示例如下 file= ...
- shell 环境变量的相关配置文件和配置方法
shell 环境变量的相关配置文件和配置方法: bash 的配置文件: 全局配置: /etc/profile, /etc/profile.d/*.sh, /etc/bashrc 个人配置 ~/.bas ...
- Linux编程 12 (默认shell环境变量, PATH变量重要讲解)
一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash shell支持的Bourne变量 Bo ...
- shell模板变量替换
我们经常使用一些模板语言来处理一些变量替换.比如jsp,php,velocity,freemarker,thymeleaf等.那对于shell来说,应该怎样替换变量呢.有一种很简单的办法可以做到. 先 ...
- centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/index.php <<EOF重定向 shell的变量和函数命名不能有横杠 平台可以用arch命令,获取是i686还是x86_64 curl 下载 第三十九节课
centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/ind ...
随机推荐
- JS-OC通信之Cordova简介
Cordova 是一个可以让 JS 与原生代码(包括 Android 的 java,iOS 的 Objective-C 等)互相通信的一个库,并且提供了一系列的插件类,比如 JS 直接操作本地数据库的 ...
- iOS事件:触摸事件.运动事件.远程控制事件
iOS中,提供了事件处理:触摸事件,运动事件,远程控制事件.这很大得方便程序猿的工作. 这里先简单做个介绍: // // ViewController.m // demo // // Created ...
- HTTP、Scoket网络协议浅解
协议:协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则. HTTP协议:超文本传输协议,它允许将超文本标记语言(HTML)文档从web服务器传送到客户端的浏览器.HTTP是一个 ...
- Win7 登入提示临时漫游档案
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
- 10、网页制作Dreamweaver(扩展:各浏览器对 onunload 事件的支持与触发条件实现有差异)
标准参考 在 HTML 4.01 规范中关于 onunload 事件的描述是:当 document 从 window 中移除时,触发 onunload 事件. 关于 HTML 4.01 规范中 onu ...
- Unity3D 创建动态的立方体图系统
Unity3D 创建动态的立方体图系统 这一篇主要是利用上一篇的Shader,通过脚本来完成一个动态的立方体图变化系统. 准备工作如下: 创建一个新的场景.一个球体.提供给场景一个平行光,准备2个立方 ...
- Linux 基础入门(新版)(实验一至实验四)
1.实验一 Lniux简介 操作系统:系统调用+内核 Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体验欠缺:有全球所有的 Linux ...
- Magento 自定义URL 地址重写 分类分级显示
我们打算将URL在分类页面和产品页面分别定义为: domain.com/category/分类名.html domain.com/category/子分类名.html domain.com/goods ...
- Carthage
Carthage Carthage - 一个简单.去集中化的Cocoa依赖管理器
- 【转】C++11中的std::function
原文地址:http://www.jellythink.com/archives/771 看看这段代码 先来看看下面这两行代码: std::function<void(EventKeyboard: ...