Shell编程基础及变量
一、Shell脚本
1.Shell脚本的建立
由Linux命令、shell命令、程序结构控制语句和注释等内容组成。
脚本第一行
#!/bin/bash
#!字符称为幻数,内核会根据它后面的解释器来确定该用什么程序解释脚本
bash与sh的区别
sh为bash的软连接,多数情况下无区别
[xiaoda@codis-178 ~]$ ll /bin/sh
lrwxrwxrwx. 1 root root 4 Mar 4 2016 /bin/sh -> bash
[xiaoda@codis-178 ~]$ ll /bin/bash
-rwxr-xr-x. 1 root root 1009968 Nov 17 2014 /bin/bash
检查bash是否有漏洞
[root@codis-178 ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"
this is a test
如果返回以下两行,则尽快升级
be careful
this is a test
若不指定解释器,则用对应解释器执行脚本
bash test.sh
python test.py
expect test.exp
2.脚本注释
解释器看不到,不会执行
可跟在脚本命令的后面,与命令在同一行
尽量不要用中文
3.shell脚本的执行

(1)查找系统环境变量ENV,该变量指定了环境文件,加载顺序/etc/profile ->.bash_profile->.bashrc->/etc/bashrc
(2)执行脚本
(3)自上而下,从左到右依次执行(脚本嵌套时,先执行自脚本)
4.执行脚本的方式
(1)bash script-name 或 sh script-name
(2)path/script-name 或 ./script-name
(3)source script-name 或 . script-name
(4)sh<script-name 或 cat script-name|sh
示例:
已知以下命令及返回结果,请问echo $user的返回结果是
cat test.sh
user='whoami'
sh test.sh
echo $user
a.当前用户
b.oldboy
c.无内容输出
答案是:c
解释:
sh和bash执行脚本会启动新的子shell,执行完后退回到父shell,因此变量或函数值无法保留。
结论:
- 子shell脚本会直接继承父shell脚本的变量、函数等,反之不可
- 若想反过来继承,要用source 或 "." 在父shell中事先加载子shell
二、变量
1.变量特性
shell中不区分变量的类型(整数、小数、字符串等)
2.变量类型
(1)环境变量(全局)
export内置命令导出的变量(用户名、路径、目录)
名字采用大写形式
set命令输出所有变量(全局和局部)
env命令只显示全局
$HOME #用户家目录
$UID #当前用户的UID
$PWD #当前工作目录的绝对路径
$SHELL #当前shell
$USER #当前用户
环境变量初始化及生效顺序

- 登录系统,加载主环境变量文件/etc/profile
- 执行/etc/profile.d目录下的脚本
- 运行$HOME/.bash_profile用户环境变量文件
- 在用户环境变量文件中会去找$HOME/.bashrc,如果有这个文件则执行,没有找/etc/bashrc全局环境变量文件
(2)普通变量(局部)
由字母、数字、下划线组成
可以用单引号或双引号引起来
[xiaoda@codis-178 ~]$ a=192.168.16.1
[xiaoda@codis-178 ~]$ b='192.168.16.1'
[xiaoda@codis-178 ~]$ c="192.168.16.1"
[xiaoda@codis-178 ~]$ echo "a=$a"
a=192.168.16.1
[xiaoda@codis-178 ~]$ echo "b=$b"
b=192.168.16.1
[xiaoda@codis-178 ~]$ echo "c=$c"
c=192.168.16.1
[xiaoda@codis-178 ~]$ echo "c=${c}"
c=192.168.16.1
[xiaoda@codis-178 ~]$ a=192.168.16.1-$a
[xiaoda@codis-178 ~]$ b='192.168.16.1-$a'
[xiaoda@codis-178 ~]$ c="192.168.16.1-$a"
[xiaoda@codis-178 ~]$ echo "a=$a"
a=192.168.16.1-192.168.16.1
[xiaoda@codis-178 ~]$ echo "b=$b"
b=192.168.16.1-$a
[xiaoda@codis-178 ~]$ echo "c=${c}"
c=192.168.16.1-192.168.16.1-192.168.16.1
把命令的结果作为变量的内容进行赋值
[xiaoda@codis-178 ~]$ CMD=$(date + %F)
date: extra operand `%F'
Try `date --help' for more information.
[xiaoda@codis-178 ~]$ CMD=$(date +%F)
[xiaoda@codis-178 ~]$ echo $CMD
2017-07-04
[xiaoda@codis-178 ~]$ echo $(date +%F).tar.gz
2017-07-04.tar.gz
[xiaoda@codis-178 ~]$ echo $(CMD).tar.gz
-bash: CMD: command not found
.tar.gz
[xiaoda@codis-178 ~]$ echo $CMD.tar.gz
2017-07-04.tar.gz
[xiaoda@codis-178 ~]$ echo ${CMD}.tar.gz
2017-07-04.tar.gz
3.变量输出
单引号:内容原样输出,强引用
双引号:如果内容有命令、变量、转移符等,会解析出结果再输出,弱引用
反引号:引用命令
[xiaoda@codis-178 ~]$ echo 'today is date'
today is date
[xiaoda@codis-178 ~]$ echo 'today is `date`'
today is `date`
[xiaoda@codis-178 ~]$ echo "today is date"
today is date
[xiaoda@codis-178 ~]$ echo "today is `date`"
today is Tue Jul 4 15:34:38 CST 2017
[xiaoda@codis-178 ~]$ echo "today is $(date)"
today is Tue Jul 4 15:34:49 CST 2017
调用变量
[xiaoda@codis-178 ~]$ OLDBOY=testchars
[xiaoda@codis-178 ~]$ echo $OLDBOY
testchars
[xiaoda@codis-178 ~]$ echo '$OLDBOY'
$OLDBOY
[xiaoda@codis-178 ~]$ echo "$OLDBOY"
testchars
其他调用方式
[xiaoda@codis-178 ~]$ cat grep.log
testchars
oldboy
[xiaoda@codis-178 ~]$ grep "$OLDBOY" grep.log
testchars
[xiaoda@codis-178 ~]$ grep '$OLDBOY' grep.log
[xiaoda@codis-178 ~]$ grep $OLDBOY grep.log
testchars
[xiaoda@codis-178 ~]$ ETT=123
[xiaoda@codis-178 ~]$ awk 'BEGIN {print "$ETT"}'
$ETT
[xiaoda@codis-178 ~]$ awk 'BEGIN {print $ETT}'
[xiaoda@codis-178 ~]$ awk 'BEGIN {print '$ETT'}'
123
[xiaoda@codis-178 ~]$ awk 'BEGIN {print "'$ETT'"}'
123

Shell编程基础及变量的更多相关文章
- Shell 编程基础之变量和环境变量
一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...
- shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~]# cat /server/scripts/show2.sh #!/bin/ ...
- 【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
[转]shell编程下 特殊变量.test / [ ]判断.循环.脚本排错 第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~] ...
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- shell编程基础(转载)
Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- Linux学习之二十一-shell编程基础
Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...
- 7-1 shell编程基础之二
shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...
随机推荐
- plsql programming 20 管理PL/SQL代码(个人感觉用不到)
这一章的内容, 只完成了一部分, 剩下的用到再补充吧 由于依赖关系, 而编译失败, 需要重新编译. ( 所谓依赖, 是指存储过程, 函数等在运行中调用的对象, 比如table 等, 比如你删除了过程中 ...
- 我的第六个java程序 spring-bean
配置文件 Beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...
- python 面向对象三大特性(封装 多态 继承)
今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...
- jQuery EasyUI编辑DataGrid用combobox实现多级联动
我在项目中设计课程表的时候需要用到老师和分类之间的多级联动. 首先是一张效果图: 下面是实现的代码: <body> <script type="text/javascrip ...
- python3----冒泡排序
array = [1, 6, 7, 2, 9, 4] for i in range(len(array)-1, 1, -1): for j in range(0, i): if array[j] &g ...
- 使用PHP函数输出前一天的时间和后一天的时间
1.明确date()函数和time()函数的功能,其中time()函数是获取时间戳函数 2.输出前一天的当前时间: echo '一天之前的时间为:'.date('Y-m-d H:i:s',time() ...
- thinkPHP为什么设置一个单入口文件?
TP3.2的具体解释: ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个应用都有一个统一(但不一定是唯一)的入口. 应该说,所有应用都是从入口文件开始的,并且不同应用的入口文 ...
- Android Studio下通过Gradle配置实现资源文件的模块化
当开发一个app模块个数很多的时候,资源文件就会特别多,布局也会多起来,这时所有的layout都放在同一个目录下,就会显得臃肿,而且不好找相应的布局. 最近看到相关资料,发现在Android Stud ...
- 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)
[BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
[BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...