shell script语法
Shell基本操作
- 什么Shell,什么是Shell脚本。Shell是 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。通过登录命令,用户可以登录到linux中。在macOS上直接使用
login
。如果要切换用户,运行sudo -s -u username
。而Shell 脚本(shell script),是一种为 shell 编写的脚本程序 - 运行 shell
- 创建文件
*.sh
,运行chmod 755 *.sh
是文件可执行,再运行./*.sh
或者/bin/sh or bash *.sh
就可以运行脚本 - tip: 为什么要在
.sh
文件中定义#!/bin/sh
或#!/bin/bash
,因为两者支持的语法有一些稍微的不同,有哪些不同呢?
- 创建文件
基础语法
变量
命名规则,和大多数的编程语言一致,作为入门的我没有发现有什么特别的地方
使用变量,${变量名称},左右花括号帮助shell识别变量的范围,如果想要在字符串中拼接变量,当前字符串需要用双引号,否则变量引用也会被当做是字符串的一部分,但是单引号如果成对使用就可以使用变量
1
2
3
4
5
6echo "current user ${USERNAME}"
current user zengqiangfang
echo 'current user ${USERNAME}'
current user ${USERNAME}
echo 'current user '${USERNAME}'
current user zengqiangfang变量类型
- 局部变量,定义在当前shell环境中,shell控制台或者shell代码都可
- 环境变量,运行
env
,可以看到当前环境的所有变量 - shell变量,暂时么有发现使用场景
字符串操作
获取字符串的长度
1
{#string}, ${#string[0]}
冒号可以用来分割字符串
字符串查找使用
expr
eg?
数组操作
定义:array_name=(v1 v2 …)
使用下标获取数组的元素
获取数组的长度
1
{#array_name[@]} 或者 ${#array_name[*]}
获取当前数组的所有元素
1
{array_name[@]} 或者 ${array_name[*]}
获取当前数组的所有key
1
{!array_name[@]} 或者 ${!array_name[*]}
声明关联数组
declare -A array
,这样声明的数组的key可以是字符,数字,或者任意字符串,eg:declare -A array=(["a1"]="a1")
参数
- 传递参数,**
$
+数字**,数字几代表的是第几个参数,这里要注意的是,$0
表示的是当前文件的名称 - 一些特殊意义的符号,
$#
输出参数的个数,$@
一个一个的输出参数,$*
以字符串的形式输出参数,$?
检测当前程序是否报错,无错输出0
- 传递参数,**
基本运算符
- bash不支持简单的数学运算符,但是可以通过其他的bash命令来完成,在shell中提供了两类工具
awk
和expr
,expr
更常用,对于expr中的表达式以及其其自身用需要使用反引号”`“,”`expr 2 + 2`“ - 使用关系运算符时,被比较的两个变量需要距离左右括号一个空格,不能紧贴
[]
,eg:[ 1 -eq 2 ]
- 字符串运算符,
-z
表示检测当前字符串长度是否为0,-n
字符串长度是否不等于零 - 文件测试运算符,检测文件的各种属性 [operater file]
- bash不支持简单的数学运算符,但是可以通过其他的bash命令来完成,在shell中提供了两类工具
echo命令
- echo -e,表示是否开启转义,直接识别字符串中需要转义的字符自动转义
echo string > file
将string输出到文件中
printf命令,也是一个标准输出命令,语法
printf format-string [arguments...]
test命令,测试变量是否相等,测试字符串,测试文件(是否存在之类的)
流程控制
- if else
1
2
3
4
5
6if [condition]
then
do something xxx
else
do something xx
fi- if else-if else
1
2
3
4
5
6
7
8
9if [condition]
then
xxxxx
elif [condition]
then
xxxx
else
xxxx
fi- for iteration
1
2
3
4for var i in [xxxx];
do
xxxx
done;- while/until iteration
1
2
3
4while or until [condition]
do
xxxx
done- switch case
1
2
3
4
5
6case value in
pattern1) xxxx
;;
pattern2) xxxx
;;
esac函数
1 | functionName() { |
- 输入输出重定向 (箭头指向表明数据的流向)
- 输出重定向
command1 > file
,向文件的末尾追加内容,不覆盖之前的内容command2 >> file
,也就是把输出内容写入到文件中 - 输入重定向,从一个文件中读取数据,
command < file
- 三个特殊文件操作符 0 stdin,1 stdout,2 stderr
- 标准输入,键盘
- 标准输出,屏幕
- 标准错误,屏幕,若输出标准错误到文件中使用
2>
,合并标准错误和标准输出2>&1
eg:who | greg "zeng" > file 2>&1
,使用以上的命令会将标准输出和错误绑定输入到标准输出中,若who | greg "zeng" > file 2>1
,则会把标准输出和错误输出到新文件中 - tips: 这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出
- 输出重定向
- 文件包含,使用
.
orsource
,. ./script.sh
,这样被引用的文件中的变量和函数就可以在当前的脚本中使用
- Title: shell script语法
- Author: Xiao Qiang
- Created at : 2023-03-16 12:20:51
- Updated at : 2025-03-08 10:49:30
- Link: http://fdslk.github.io/tech/shell/2023/03/16/shell-101/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments