一、概论
本篇好像在hexo网站看不了,请移步到CSDN网站观赏!!!!CSDN网站入口
shell是我们通过命令行与操作系统沟通的语言。可以直接在命令行中运行,也可以将一套逻辑组织成一个文件,方便复用。
linux系统默认使用bash脚本
①vim test.sh文件之后(创建一个文件)
#首行指明bash为默认的脚本解释器
#! /bin/bash
#输出hello world
echo "hello world"
②运行方式
bash + 文件名 : bash test.sh
当 ls -l test.sh之后,会发现只有r,w的读写可以进行,需要先加入一个可以执行的操作
- chmod +x test.sh
如果在当前路径的话: ./test.sh
可以用绝对路径: /home/acs/test.sh
也可以用相对路径: ~/test.sh #家目录下执行
二、注释
①单行注释
# 这是一行注释
②多行注释
:<<EDF
注释1
注释2
注释n
<<EOF
# EOF可以用其他任意字符串都可以
三、变量
①定义变量
定义变量不需要加$符号
name1="wjw" #定义变量等号两边不能有空格
name2='wjw' #单引号也可以定义
name3=wjw #也可以不加引号
②使用变量
使用变量的时候需要加上$或者 加上一个{};
name=wjw #定义变量
echo ${name} #输出wjw
echo ${name}hhh #输出wjwhhh
③只读变量
变量的值是没办法改变的
name=wjw
readonly name #第一种写法
declare -r name #第二种写法
④删除变量
用unset可以删除变量
name=wjw
unset name
echo $name #输出空行
⑤变量类型
- 自定义变量(局部变量)
- 子进程不能访问的变量
- 环境变量(全局变量)
- 子进程可以访问的变量
自定义变量改成环境变量(下面是在终端下进行操作)
acs@2ba77538d358:~$ name=wjw #定义变量
acs@2ba77538d358:~$ export name #第一种方式
acs@2ba77538d358:~$ declear -x name #第二种方式
acs@2ba77538d358:~$ exit #退出当前进程
环境变量改成自定义变量
acs@2ba77538d358:~$ export name=wjw #定义环境变量
acs@2ba77538d358:~$ declear +x name #改为自定义变量
开一个子进程
acs@2ba77538d358:~$ bash #开一个子进程
#在子进程下,只可以访问环境变量
acs@2ba77538d358:~$ exit 或者 [Ctrl + d]都可以退出子进程
⑥字符串
单引号:原样输出,不会转义,也不会直接取值
双引号:(不加引号) 会转义也会取值
name=wjw
echo 'hello,$name \"hh\"' #输出hello,$name \"hh\"
echo "hello,$name \"hh\"" #输出hello,wjw "hh"
获取字符串长度
name="wjw"
echo ${#name} #输出3
提取字串
name=hello,wjw
echo ${name:0:5} #提取从0开始的5个字符
#此处的定义类似于c++的substring函数
四、默认变量
①文件参数变量
在执行shell脚本的时候,可以向脚本传递参数。
#! /bin/bash
echo "文件名: "$0
echo "第一个参数: "$1
echo "第二个参数: "$2
然后如果执行该脚本的话:
acs@2ba77538d358:~$ chmod +x test.sh
acs@2ba77538d358:~$ ./test.sh wjw 18
#后续会输出的是
文件名: ./test.sh
第一个参数: wjw
第二个参数: 18
②其他默认参数变量
参数 | 参数的相关说明 |
---|---|
$# | 代表文件传入的参数个数,如上面例子中的值为4 |
$* | 由所有参数构成的用空格隔开的字符串,如“./test.sh wjw 18” |
$@ | 每个参数用分别用双引号括起来,“./test.sh” “ wjw” “18” |
$$ | 脚本当前运行的进程ID |
$? | 上一条命令的退出状态,0表示正常,其他值表示错误 |
$(command) | 返回command 这条命令的stdout(标准输出) |
‘command’ | 返回command 这条命令的stdout(标准输出) |
五、数组
数组可以存放多个不同类型的值,只支持一维数组,初始化不需要指明数组的大小
下标从0开始
①定义
array=(1 abc "def" wjw) #第一种方法
array[0]=1 #第二种方法
array[1]=abc
②读取并输出
echo ${array[index]} #读取并输出(隔行输出)
echo ${array[@ or *]} #读取整个字符串(空格输出)
#没有开到的空间用不上,例如
array[0]=wjw
array[1000]=18
echo ${array[*]} #打印结果为wjw 18
echo ${#array[*]} #打印结果为2(代表数组元素个数)