shell
shell是命令解释器、用于释放用户对操作系统的操作
centos7默认使用的shell是bash
shell脚本
#开头的注释- 执行命令
bash ./filenaem.sh(使用bash执行不需要赋予执行权)
内建命令和外部命令的区别
- 内建命令不需要创建子进程
- 内建命令对当前的shell生效
shell变量
变量命名规则
- 字母、数字、下划线
- 不以数字开头
为变量赋值的过程、称为变量交换
#!/bin/sh
# 变量名=变量值 等号两边不能有空格
variable=value
# 赋值字符串、可以是单引号
variable='value'
# 赋值字符串、可以是双引号
variable="value"
# 使用let为变量赋值
let a=10+20
# 不使用let 则a是一个表达式
a=10+20
echo $a => 10+20
# 将命令赋值给变量
letc=ls
# 将命令结果赋值给变量、使用$() || ``
let c=$(ls -l)
echo $letc
# 在列表中添加值
list="a b c"
list=#list" d"
echo $list => "a b c d"
变量值有空格等特殊字符也可以包含在
""(双引号)或''(单引号)中
注意
赋值号周围不能有空格、和我们日常js开发有点不同、需要注意一下
使用变量
使用定义过的变量、需要在变量前面加美元符号$
#!/bin/sh
# 将字符串"value" 赋值给var
var="value"
# 使用echo输出变量的值
echo $var => "value"
变量的引用
${变量名}称作对变量的引用echo${变量名}查看变量的值${变量名}在部分情况下可以省略为$变量名
#!/bin/sh
# 将字符串"value" 赋值给var
var="value"
# 使用echo输出变量的值
echo $var => "value"
echo ${var}
# 以上两种方式都是可以的
修改变量
#!/bin/sh
label="value"
echo ${label}
label="value1"
echo ${label}
# 输出结果为 "value" 和 "value1"
只读变量
#!/bin/sh
label="hello woeld!"
readonly label
label="hello ggt"
# 输出 readonly variable 不可以进行修改、是一个只读属性
删除变量
使用unset命令可以删除变量
#!/bin/sh
label="value"
unset label
# 变量删除后不能再次使用、`unset`命令不能删除只读变量
作用范围
#!/bin/sh
# 将 1 赋值给 a
a=1
# 打开新的子进程 bash
bash
# 输出变量 a (在子进程)
echo $a
# 这里是空、作用范围仅在当前进程
# 将 2 赋值给a(还是在子进程)
a=2
# 退出子进程
exit
# 输出变量 $a
ehco $a
# 值为1
# 执行某个脚本也是开启子进程、所以脚本定义的变量对当前操作终端不生效
bash xx.sh
# 如果要生效、可以执行以下命令
source xx.sh
导出变量
使用export关键字可以让子进程获取到父进程的变量
#!/bin/bash
label="value"
export $label
# 这里会报一个错、export: `"value"': not a valid identifier
# $label 是一个值、""
$export label
# 使用bash 去开一个子进程去访问 label
系统环境变量
系统换机功能变量是每个shell打开都可以获得到的变量
查看环境变量
#!/bin/bash
env | more
# 分页查看环境变量配置文件
# 查看某个单独的变量
echo $USER
echo $UID
echo $PATH
添加命令到当前环境变量路径
#!/bin/bash
# 编写一个shell脚本文件
vim a.sh
# (脚本文件)内含以下命令
export "hello linux"
# 编写保存后、产看当前脚本文件所在路径
/root
# 将当前路径添加到$PATH
PATH=$PATH:/root
# 执行脚本
a.sh
# 提示没有权限的时候 chmod u+r+x filename.sh
特殊变量
$0当前脚本的文件名$n传递给脚本或者函数的参数、n是一个数字、从$1-$9,第十个参数是${10}$#传递给脚本函数的参数个数$*传递给脚本或者函数的所有参数$@传递给脚本或者参数的所有参数
向脚本文件传递参数
#!/bin/bash
echo "Process ID: $$"
# $$ 所有进程id
echo "File Name: $0"
# $0 脚本文件名
echo "First Parameter: $1"
# 传递给脚本或者函数的第一个参数
echo "Second Parameter: $2"
# 传递给脚本或者函数的第二个参数
echo "All Parameters 1: $@"
# 传递给脚本或者函数的所有参数
echo "All Parameters 2: $*"
echo "Total: $#"
# 运行这个脚本 并且传递参数 bash bash.sh shell linux
# shell为第一个参数、linux为第二个参数
向函数传递参数
#!/bin/bash
# 定义函数
function func() {
echo "Language: $1"
# 第一个参数
echo "URL: $2"
# 第二个参数
echo "First Parameter : $1"
# 第一个参数
echo "Second Parameter : $2"
# 第二个参数
echo "All parameters 1: $@"
# 所有参数
echo "All parameters 2: $*"
# 所有参数
echo "Total: $#"
# 所有参数
}
# 调用函数 javascript 为第一个参数、第二个是linux
func javascript linux
运行结果
Language: javascript
URL: linux
First Parameter : javascript
Second Parameter : linux
All parameters 1: javascript linux
All parameters 2: javascript linux
Total: 2
获取上个命令的退出状态
$?是一个特殊的变量、用来获取上一个命令的退出状态、或者上一个函数的返回值
#!/bin/bash
if [ "$1" === 100 ]
then
exit 0 # 参数正确,退出状态为 0
then
exit 1 # 参数错误,退出状态为 1
fi
`exit` 表示退出当前 Shell 进程,我们必须在新进程中运行 `test.sh`,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法取得它的退出状态了。
$ bash ./test.sh 100
# 上条命令是否正确执行,0-正确,1-不正确
$ echo $?
0
获取函数的返回值
#!/bin/bash
#得到两个数相加的和
function add(){
return `expr $1 + $2`
}
add 30 50 #调用函数
echo $? #获取函数返回值
# 80
有 C++、C#、Java 等编程经验的读者请注意:严格来说,Shell 函数中的 `return` 关键字用来表示函数的退出状态,而不是函数的返回值;Shell 不像其它编程语言,没有专门处理返回值的关键字。
空的参数
当执行脚本文件时,第二个参数为空时、可以使用替换值
#!/bin/bash
echo $1
# 当第二个参数为空,输出后面值 _
echo ${2}_
# 参数替换,如果 $2 取值为空值,将下划线 `_` 为位置二赋值
echo ${2-_}
# 执行 bash bash.sh -a
环境变量配置文件
配置文件
-
etc/profile -
etc/profile.d -
~/.bash_profile -
~/bashrc -
/etc/bashrc
凡是
/etc下的配置文件是所有用户通用的配置文件。