shell语法(1)


一、概论

本篇好像在hexo网站看不了,请移步到CSDN网站观赏!!!!CSDN网站入口

shell是我们通过命令行与操作系统沟通的语言。可以直接在命令行中运行,也可以将一套逻辑组织成一个文件,方便复用。

linux系统默认使用bash脚本

vim test.sh文件之后(创建一个文件)

#首行指明bash为默认的脚本解释器
#! /bin/bash
#输出hello world
echo "hello world"

②运行方式

  1. bash + 文件名 : bash test.sh

  2. 当 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(代表数组元素个数)

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