1.shell基础
1.1 基础知识
- 单引号和双引号的区别:
- 通过单引号定义变量,输出变量内容时单引号里面是什么就输出什么,即使内容中有变量和命令也会将它们原样输出;单引号中不能出现单引号,即使有转义符号转义了也不可以
- 通过双引号定义变量,输出变量时引号里的变量及命令(要反引下)会经过解析后才输出该变量的内容,而不是将引号中的变量或命令原样输出;双引号中可以使用转义符号
- 注释:shell中只有单行注释,无多行注释。如需要临时注释一段代码,后面需要取消注释,可以用花括号括起来作为一个函数,代码中没有调用此函数,这段代码就不会执行
1.2 shell脚本实例
#!/bin/bash
echo "Hello World !"
- 说明:
#!
是一个约定标记,它告诉系统这个脚本需要什么解释器来执行
1.3 运行shell脚本的方式
- 1.作为可执行程序
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
./test.sh
表示在当前目录找 test.sh 文件
- 2.作为解释器参数
# 此方式运行脚本,不需要在脚本的第一行指定解释器信息
/bin/sh test.sh
/bin/php test.php
- 3.
sh test.sh
1.4 echo的使用
# 显示换行
echo -e "ok! \n" #-e开始转义
echo "It is a test"
#OK!
#
#It is a test
# 显示不换行
echo -e "ok! \c" #-e开始转义 \c不换行
echo "It is a test" # OK! It is a test
# 显示结果定向至文件
echo "It is a test" > myfile
# 显示命令执行结果,命令需要用``反引号
echo `date`
2.shell变量
2.1 变量的命名规范
- 变量名和‘=’之间不能有空格
- 变量名可以包含数字、字符和下划线,但不能以数字开头(可以以下划线开头)
- 变量名中间字符不能有空格
- 不能使用标点符号
- 不能使用bash中的关键字
2.2 取变量的值
- 使用一个变量时,在变量名前加上$符号即可,变量名外面的花括号可选,可以加也可以不加
# 给变量赋值
your_name="qinjx"
# 取变量值并输出
echo $your_name
# 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,如:echo "I am good at ${skill}Script" => 若不加上{},那么系统则会当做:$skillScript
echo ${your_name}
2.3 环境变量
- 作用:一般用于定义shell的运行环境,可以通过环境变量来确定登录用户名、命令路径、终端类型、登录目的等
创建与删除
创建临时的环境变量:可以在命令行中设置,但用户退出命令行时这些变量值就会丢失,设置方法有如下三种:
- 1.
export name=value
- 2.
name=value export name
- 3.
declare -x name=value
- 1.
创建永久的环境变量:可以在
.bash_profile
或者.bashrc
文件中或在/etc/bashrc
或/etc/profile
或/etc/profile.d/
中定义,实例:- 1.在/etc/profile文件中添加变量
CLASSPATH
【对所有用户生效(永久的)】
# 1.打开 /etc/profile 文件并加入如下行: export CLASSPATH="my test classpath"; # 2.保存文件后需要执行 source /etc/profile 才能马上生效,否则只能在下次重进此用户时才能生效
- 2.在用户目录下的.bash_profile(/home/elaine/)文件中增加变量,方法同上【对单一用户生效(永久的)】
- 说明:将环境变量保存至上述文件中,每次用户登录时这些变量值都会被初始化一次,若想要修改后马上生效,需要执行
source /etc/profile
,否则只能在下次重进此用户时才能生效
- 1.在/etc/profile文件中添加变量
- 删除环境变量:使用
unset
命令,可以直接在命令行中输入unset name
2.4 变量的说明
- 已定义的变量可以重新被定义
变量中需要加入命令:使用反引号即可,如下例:
_filename=`ls`; echo $_filename; # 运行以上两句,将会将当前目录下的所有文件名与文件夹名称全部输出
只读变量:用
readonly
关键字标记变量即可- 删除变量:
unset
即可删除变量,变量被删除后不能再次使用,且不能删除只读变量
- shell的变量类型:运行shell时会同时存在三种变量
- 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
- 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量
- shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
3.shell字符串与数组
3.1 字符串基础用法
# 拼接字符串
str="${_str}${_str1}";
echo "拼接字符串_str与_str1后的字符串为:$str";
# 获取字符串长度
echo "length(_str) = ${#_str}";
# 截取字符串
# 第一位从0开始哈
subStr=${_str:10:6};
echo "截取字符串_str从第11个字符开始的后6个字符为:$subStr";
3.2 数组基础用法
- 数组声明:
array_name(value1 value2...valuen)
- 获取数组的值
- 获取数组中某个元素:
${array_name[0]}
- 获取数组中所有元素:
${array_name[*]}
or${array_name[@]
- 获取数组中某个元素:
- 获取数组长度:
${#array_name[*]}
or${#array_name[@]}
4.shell参数传递
4.1 传递参数基础用法
# 传参方式,在执行脚本后带上参数,参数间用空格隔开
$ ./test.sh 111 222 333
# 取参方式,$n的格式获取,n为数字,1表示第一个参数,2表示第二个参数...,其中$0为执行的文件名
echo "执行的文件名:$0"; #./test.sh
echo "第一个参数:$1"; #111
echo "第一个参数:$2"; #222
echo "第一个参数:$3"; #333
4.2 特殊字符
字符 | 说明 |
---|---|
$* | 以单个字符获取所有的参数,” 1 1 2$3…” |
$@ |
获取所有的参数,”2”“$3”… |
$# | 获取输入参数的个数 |
4.3 read的常用方式
- 从终端输入显示的值并读取:
read -p
orecho -n
# echo -n指定提示符
echo -n "Enter your name:"
read name;
echo "hello,$name,we are friends now!";
# 用read -p来直接指定提示符
read -p "please Enter your name:" name;
echo "hello,my name is $name";
# read -p指定多个变量
read -p "Enter your name:" first middle last
echo "Checking data for $last, $middle, $first"
- 隐藏从终端输入的值并读取
# 输入时不显示,如密码等
read -p "please Enter your password:" -s password;
echo "my password is $password";
5.shell基本运算符
5.1 关系运算符
运算符 | 说明 |
---|---|
-eq | 判断两个数是否相等,相等返回true |
-ne | 判断两个数是否不相等,不相等返回true |
-gt | 判断左边的数是否大于右边的数,是则返回true |
-lt | 判断左边的数是否小于右边的数,是则返回true |
-ge | 判断左边的数是否大于等于右边的数,是则返回true |
-le | 判断左边的数是否小于等于右边的数,是则返回true |
5.2 布尔运算符
运算符 | 说明 |
---|---|
! | 非运算符,表达式为false则返回true,否则返回false |
-o | 或运算符,有一个表达式为true则返回true |
-a | 与运算符,两个表达式都为true才返回true |
5.3 逻辑运算符
运算符 | 说明 |
---|---|
&& | AND |
` |
5.4 字符串运算符
运算符 | 说明 |
---|---|
= | 判断两个字符串是否相等,相等返回true |
!= | 判断两个字符串是否相等,相等返回false |
-z | 判断字符串长度是否为0,为0返回true |
-n | 判断字符串长度是否为0,不为0返回true |
字符串本身 | 判断字符串是否为空,不为空返回true,例:[$a]返回false |