Shell是用户与内核进行交互操做的一种接口,目前最流行的Shell称为bash Shell。Shell也是一门编程语言<解释型的编程语言>,即shell脚本<就是在用linux的shell命令编程>。一个系统能够存在多个shell,能够经过cat /etc/shells命令查看系统中安装的shell,不一样的shell可能支持的命令语法是不相同的。
html
代码写在普通文本文件中,一般以 .sh为后缀名编程
vi intsmaze.shcentos
#!/bin/bash ## 表示用哪种shell解析器来解析执行咱们的这个脚本程序 echo "hello world" ## 注释也能够写在这里
## 这是一行注释
执行脚本bash
sh intsmaze.sh微信
或给脚本添加x权限,直接执行,不然只能经过sh xxx.sh执行
app
chmod 755 intsmaze.shless
./intsmaze.sh编程语言
Linux Shell中的变量分为“系统变量”和“用户自定义变量”。能够经过set命令查看系统变量。
[hadoop@centos-Reall-131 shtest]$ set BASH=/bin/bash HADOOP_HOME=/home/hadoop/hadoop-2.6.4 HISTCONTROL=ignoredups HISTFILE=/home/hadoop/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/home/hadoop HOSTNAME=centos-Reall-131 HOSTTYPE=i386 ID=500 JAVA_HOME=/home/hadoop/app/jdk1.7.0_65 LANG=en_US.UTF-8 LESSOPEN='|/usr/bin/lesspipe.sh %s' LINES=24 LOGNAME=hadoop
访问系统变量:$HOME、$PWD、$SHELL、$JAVA_HOME等等
一、语法
变量=值 (例如STR=abc)
等号两侧不能有空格
使用变量: $arg
双引号和单引号有区别:双引号仅将字符串中的空格脱意;单引号会将字符串中的变量引用好比$param脱意。
二、示例
[hadoop@centos-Reall-131 ~]$ STR=hello world
-bash: world: command not found
[hadoop@centos-Reall-131 ~]$ STR="hello world" [hadoop@centos-Reall-131 ~]$ A=9 [hadoop@centos-Reall-131 ~]$ echo $A 9 [hadoop@centos-Reall-131 ~]$ echo $STR hello world
若是想打印 hello worlds is greater 怎么办?
echo $STRs is greate 行吗?
不行,正确写法是:
echo ${STR}s is greate
[hadoop@centos-Reall-131 ~]$ echo ${STR}s is greate hello worlds is greate [hadoop@centos-Reall-131 ~]$ echo '${STR}s is greate' ${STR}s is greate
[hadoop@centos-Reall-131 ~]$ echo "please$STR"
pleasehello world
[hadoop@centos-Reall-131 ~]$ echo 'please$STR'
please$STR
unset A 撤销变量 A
readonly B=2 声明静态的变量 B=2,不能 unset
export A #可把变量提高为当前shell进程中的全局环境变量,可供其余子shell程序使用
vi a.sh
#!/bin/bash
a="a in a.sh" echo $a /root/scripts/b.sh
vi b.sh
#!/bin/bash
b="b in b.sh" echo $b echo $a
而后执行 ./a.sh ,会发现b脚本中并无把a脚本中定义的a变量打印出来。
若是要在b中打印出a脚本的变量a,须要在a脚本中把变量a作export定义,此时,a变量就成了a.sh脚本所在bash进程的全局变量,该进程的全部子进程都能访问到变量a。
另外一种方式:
若是在a.sh脚本中用以下方式调用b.sh
. ./b.sh ## 注意:重点关注最前面那个 “.”号
或者
source ./b.sh ##
则,b.sh就在a.sh所在的bash进程空间中运行,而不是在a进程中的子进程中运行了。
总结:
一、a.sh中直接调用b.sh,会让b.sh在a所在的bash进程的“子进程”空间中执行
二、而子进程空间只能访问父进程中用export定义的变量
三、一个shell进程没法将本身定义的变量提高到父进程空间中去
四、“.”号执行脚本时,会让脚本在调用者所在的shell进程空间中执行
三、反引号赋值
A=`ls -la` ## 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) ## 等价于反引号
四、特殊变量
$? 表示上一个命令退出的状态码
$$ 表示当前进程编号
$0 表示当前脚本名称
$n 表示n位置的输入参数(n表明数字,n>=1)
$# 表示参数的个数,经常使用于循环
$*和$@ 都表示参数列表
注:$*与$@区别
$* 和 $@ 都表示传递给函数或脚本的全部参数
ü 不被双引号" "包含时——
$* 和 $@ 都以$1 $2 … $n 的形式组成参数列表
ü 当它们被双引号" "包含时——
"$*" 会将全部的参数做为一个总体,以"$1 $2 … $n"的形式组成一个整串;
"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式组成一个参数列表