本文和大家分享的主要是linux
中shell
编程相关内容,一起来看看吧,希望对大家学习linux shell
编程http://www.maiziedu.com/course/529/有所帮助。
基本格式
代码写在普通文本文件中,通常以 .sh
为后缀名
vi intsmaze.sh
#!/bin/bash ##
表示用哪一种
shell
解析器来解析执行我们的这个脚本程序
echo "hello world" ##
注释也可以写在这里
##
这是一行注释
执行脚本
sh intsmaze.sh
或给脚本添加x
权限,直接执行,否则只能通过
sh xxx.sh
执行
chmod 755 intsmaze.sh
./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
等等
自定义变量
1
、语法
变量=值
(例如STR=abc
)
等号两侧不能有空格
使用变量: $arg
双引号和单引号有区别:双引号仅将字符串中的空格脱意;单引号会将字符串中的变量引用比如$param
脱意。
2
、示例
[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 $A9
[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 $becho $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
进程中的子进程中运行了。
总结:
1
、
a.sh
中直接调用
b.sh
,会让
b.sh
在
a
所在的
bash
进程的
“
子进程
”
空间中执行
2
、而子进程空间只能访问父进程中用
export
定义的变量
3
、一个
shell
进程无法将自己定义的变量提升到父进程空间中去
4
、
“.”
号执行脚本时,会让脚本在调用者所在的
shell
进程空间中执行
3
、反引号赋值
A=`ls -la` ##
反引号,运行里面的命令,并把结果返回给变量
A
A=$(ls -la) ##
等价于反引号
4
、特殊变量
$?
表示上一个命令退出的状态码
$$
表示当前进程编号
$0
表示当前脚本名称
$n 表示n位置的输入参数(n代表数字,n>=1)
$#
表示参数的个数,常用于循环
$*
和
$@
都表示参数列表
注:$*与$@区别
$*
和
$@
都表示传递给函数或脚本的所有参数
ü
不被双引号
" "
包含时
——
$*
和
$@
都以
$1 $2 … $n
的形式组成参数列表
ü
当它们被双引号
" "
包含时
——
"$*"
会将所有的参数作为一个整体,以
" $1 $2 … $n
"
的形式组成一个整串;
"$@"
会将各个参数分开,以
"$1" "$2" … "$n"
的形式组成一个参数列表
来源:
博客园