!/bin/bash
echo "Hello World !"
#!
是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo
命令用于向窗口输出文本。
1. Shell 变量
1.1 定义变量
定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name="runoob.com" //变量名和等号之间不能有空格
命名规范:
- 首个字符必须为字母(a-z,A-Z)。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
1.2 使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="zhanglinyu"
echo $your_name //控制台打印出 zhangzhong
echo ${your_name} // 推荐写法
your_name="zhangzhong"
echo ${your_name} //控制台打印出 zhangzhong
//变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:${your_name}Script
1.3 只读变量
使用readonly
命令可以将变量定义为只读变量,只读变量的值不能被改变。
your_name="zhanglinyu"
readonly myUrl
your_name="zhangzhong"
**1.4 删除变量 **
使用 unset 命令可以删除变量。语法:
unset variable_name //注意不能删除只读变量
1.5 变量类型
运行shell时,会同时存在三种变量:
+ 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
+ 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
+ shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
2. Shell 字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。 推荐使用双引号。
str="Hello, I know your are ${your_name}!"
echo ${str} //双引号里面可以有变量和转义字符,单引号不行。
- 获取字符串长度
echo ${#str} //输出29
- 提取子字符串
echo ${str:1:4} 输出ello
3. 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
定义数组语法:
在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
array_name=(1 2 3 4)
//或者
array_name[0]=1
array_name[1]=2
array_name[n]=3 //可以不使用连续的下标,而且下标的范围没有限制。
** 读取数组**
echo ${array_name[0]} //
echo ${array_name[@]} //返回数组所有
获取数组的长度
length=${#array_name[@]}
echo ${length} //4
注释
以"#"开头的行就是注释,会被解释器忽略。
4. Shell 传递参数
bash test.sh test
//则第一个参数是test
//我们一般发布命令就要传入test prd之类发布到不同的环境 ,就是通过参数来区别的。
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "传入几个参数:$#";
echo "输出所有参数:$*"
echo "脚本运行的当前进程ID号:$$"
echo "脚本运行的最后一个进程ID号:$!"
//控制台输出
Shell 传递参数实例!
执行的文件名:test.sh
第一个参数为:test
5.Shell 基本运算符
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr
是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
val=`expr 2 + 2`
echo "两数之和为 : $val"
注意: 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
//10 -eq 20: a 不等于 b
file="./test.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
//文件可读
6.echo输出命令
# 控制台输入 ok 则 name等于ok
read name
echo "$name It is a test"
echo `date`//获取命令的信息 date是一个执行命令
echo $(date)//获取命令的信息
# -e 开启转义
echo -e "OK! \n $str"
# 显示结果定向到文件myfile.txt 如果没有这个文件,就会主动创建
echo "It is a test" > myfile.txt
#原样输出字符串,不进行转义或取变量(用单引号) 输出的就是$str\
echo '$str\'
#显示命令执行的时间
echo `date`
7.printf输出命令
Shell不止echo一个输出命令,还有printf。printf 命令模仿 C 程序库(library)里的 printf() 程序。标准所定义,因此使用printf的脚本比使用echo移植性好。想要学习的可以自己Google。
8.test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
9.流程控制
9.1 if else
if condition
then
command1
command2
...
commandN
fi
if [ ! -z str ]; then echo "true"; fi //如果变量长度不为0输出true
9.2 case
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
#! /bin/bash
env=$1
case $env in
test)
serverPath1=root@127.0.0.3:/usr/
;;
regress)
zipsTarget1=""
;;
prd)
serverPath1=root@127.0.0.1:/usr/
;;
*)
echo "Need to specify env (test | regress | prd)"
exit -1;
;;
esac
bash test.sh test //则执行第一条,在前端发布代码区分环境时,经常使用。
还有其他的 for循环,while 语句,until 循环,自行google。
10.Shell函数
11. Shell 输入/输出重定向
//ssh-key配置指令
cat ~/.ssh/id_rsa.pub | ssh root@127.0.0.1 "cat - >> ~/.ssh/authorized_keys"
#!/bin/bash
echo "这是重定向输出的文字" > myfile.txt #会覆盖原来文 件里面的内容
echo "以追加的形式添加到文件的末尾" >> myfile.txt #以追加的形式添加到文件的末尾
cat myfile.txt #读取myfile.txt里面的内容
//myfile.txt内容
//这是重定向输出的文字
以追加的形式添加到文件的末尾
12.rsync命令
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。
13.Linux 命令大全
14.Mac的一些常用命令
其它命令
uname 显示操作系统的有关信息
clear 清除窗口内容
env 显示当前所有设置过的环境变量
who 列出当前登录过的所有用户
whoami 列出当前正进行操作的用户名
tty 显示终端或者伪终端的名称
stty 显示或者重置控制键定义
du 查询磁盘的使用情况
df /tmp 显示文件系统的总空间和可用空间
w 显示当前系统活动的总信息
date 显示系统当前的时间和日期
cal 显示日历