linux之shell编程基本语法

简介:   Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell。Shell也是一门编程语言,即shell脚本。一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的。

  Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell。Shell也是一门编程语言<解释型的编程语言>,即shell脚本<就是在用linux的shell命令编程>。一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的。

 

原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6681562.html

微信:intsmaze

 

基本格式

  代码写在普通文本文件中,通常以 .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 $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进程中的子进程中运行了。

总结:

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" 的形式组成一个参数列表

 

作者: intsmaze(刘洋)
老铁,你的--->推荐,--->关注,--->评论--->是我继续写作的动力。
微信公众号号:Apache技术研究院
由于博主能力有限,文中可能存在描述不正确,欢迎指正、补充!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
17小时前
|
Shell Linux 信息无障碍
5 个有用的 Linux Shell 转义序列
5 个有用的 Linux Shell 转义序列
|
1天前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
7 0
|
2天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
16 5
|
2天前
|
Shell 程序员 数据安全/隐私保护
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
|
2天前
|
存储 Shell C语言
shell脚本 编程 变量 基本入门(详解)
shell脚本 编程 变量 基本入门(详解)
|
2天前
|
Linux Shell 程序员
【Linux】权限(shell运行原理、概念,Linux权限)
【Linux】权限(shell运行原理、概念,Linux权限)
9 2
|
2天前
|
存储 运维 Java
Linux笔记02 —— Shell补充
Linux笔记02 —— Shell补充
27 2
|
2天前
|
安全 Linux Shell
Linux笔记01 —— Linux初识与Shell汇总(请配合另一篇《Linux笔记02》一起使用)
Linux笔记01 —— Linux初识与Shell汇总(请配合另一篇《Linux笔记02》一起使用)
13 1
|
3天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
11 3
|
3月前
|
Ubuntu Linux Shell
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
63 0