shell


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 #输出空行

  • 变量类型

  1. 自定义变量(局部变量)
  • 子进程不能访问的变量
  1. 环境变量(全局变量)
  • 子进程可以访问的变量

自定义变量改为环境变量的方法:

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 表达式
  • 脚本注释


文章作者: cfrost
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 cfrost !
  目录