Shell语法
一、概论
shell脚本为解释执行语言
Linux 中常见的shell脚本:
- Bourne Shell (
/usr/bin/sh
或/bin/sh
)- Bourne Again Shell(
/bin/bash
)- C Shell(
/usr/bin/csh
)- K Shell(
/usr/bin/ksh
)- zsh
- …
Linux系统中一般默认使用bash,所以本文主要介绍bash中的语法
文件开头需要写明
#! /bin/shell
,指明bash为脚本解释器
新建一个test.sh文件,文件如下:
#! /bin/bash echo "Hello World!"
一般是作为可执行文件执行
chmod +x test.sh #使脚本具有可执行权限 ./test.sh #当前路径下执行 /home/test.sh #绝对路径下执行 ~/test.sh #home目录路径下执行
用解释器执行
bash test.sh
二、注释
每行中
#
之后的内容便是注释# 这是一行注释 echo 'hello word!' #这里也能写注释
格式:
:<<EOF 第一行注释 第二行注释 第三行注释 ... EOF
其中
EOF
可以替换成其他的任意字符。比如cf
或者!
三、变量
与C语言定义类似,但是
=
两边不能有空格name="hello" name1='hello' name2=hello
读取变量时需要使用
$
符号,或者是${}
符号。其中的大括号是为了让解释器识别变量的边界name=hello echo $name #输出hello echo ${name} #输出hello echo ${name} world #输出hello world
使用
readonly
或者declare -r
可以将变量变为只读name=hello readonly name declare -r name name=world #会报错,name为只读变量
unset
可以删除变量name=hello unset name echo $name #输出空行
- 自定义变量(局部变量)
- 子进程不能访问的变量
- 环境变量(全局变量)
- 子进程可以访问的变量
自定义变量改为环境变量的方法:
name=hello #定义变量 export name #第一种方法 declare -x name #第二种方法
环境变量改为自定义变量的方法:
export name=hello #定义环境变量 declare +x name #改为自定义变量 bash #进入子进程
在
shell
中的字符串可以使用单引号,也可以使用双引号,甚至可以不使用引号单引号与双引号的区别:
- 单引号中的内容会原样输出,不会执行、不会取变量
- 双引号中的内容可以执行、可以取变量
name=world #不使用"" echo 'hello, $name \" hh \"' #输出为 hello, $name \"hh\" echo "hello, $name \" hh \"" #输出为 hello, world "hh"
获取字符串长度
name=hello echo ${#name} #输出5 变量前加‘#’为取长度(字符串、数组都可)
提取子串
name="hello, world!" echo ${name:0:5} #提取从0开始的5个字符
四、默认变量
在
shell
脚本执行的时候类似C语言中的传参,$1
为传入的第一个参数,$2
为传入的第二个参数,一次类推。其中$0
是文件名(包含路径)。例子:创建
test.sh
:#! /bin/bash echo "文件名:"$0 echo "第一个参数:"$1 echo "第二个参数:"$2 echo "第三个参数:"$3 echo "第四个参数:"$4
然后执行
test.sh
:chmod +x test.sh ./test.sh 1 2 3 4 文件名:./test.sh 第一个参数:1 第二个参数:2 第三个参数:3 第四个参数:4
参数 说明 $#
运行命令时传入的参数个数 $*
所有输入的参数,用空格隔开,如“$1 $2 $3 $4” $@
所有输入的参数,分别用双引号括起来,如”$1“ “$2” “$3” “$4” $$
脚本当前运行的进程ID $?
上一条命令退出时的状态(注意不是stdout,而是exit code)。0表示正常退出,其他值表示错误 $(command)
返回 command
这条命令的stdout(可以嵌套)command
返回 command
这条命令的stdout(不可嵌套)
五、数组
shell的数组能够存放不同类型的值,但只支持一维数组,初始化时不需要指明数组的大小。
数组的下标从0开始
数组和python的元组类似,使用小括号表示,元素之间用空格隔开。例如:
array=(1 ad "ap" cls)
也可以直接定义数组中的某个元素的值:
array[0]=1 array[1]=ad array[2]="ap" array[3]=cls
格式:
${array[index]}
例如:
array=(1 ad "ap" cls) echo ${array[0]} echo ${array[1]} echo ${array[2]} echo ${array[3]}
格式:
${array[@]} #第一种写法 ${array[*]} #第二种写法
例如:
array=(1 ad "ap" cls) echo ${array[@]} #第一种写法 echo ${array[*]} #第二种写法
类似于字符串
${#array[@]} #第一种写法 ${#array[*]} #第二种写法
例如:
array=(1 ad "ap" cls) echo ${#array[@]} #第一种写法 echo ${#array[*]} #第二种写法
六、expr命令
expr
命令用于求取表达式的值,使用格式为:
expr 表达式