shell脚本基础语法

参考文档

Linux 基础语法

注意点
  • sh 与 bash 的区别一定要注意,通常linux发布版本都支持bash版本,但是部分系统默认只安装了sh,所以在使用时一定要区分(如alpine
  • sh 是shell的初始版本,bash是为了兼容sh同时兼容POSIX而开发的版本,之后的linux版本通常都为sh做了外链到bash上
  • 在重定向时,bash是先创建文件然后再执行命令
  • su 如果没有指定 - ,则为非登陆bash(不会执行登录用户加载的profile和.bashrc等脚本)
  • 命令替换在命令发生前进行
  • source 与 sh执行的区别在于: source 在当前bash中执行,而sh则在子bash中执行脚本,方法与变量对当前bash不造成影响

小括号概念

  • 定义数组的方式(sh不支持
arr=(100 200 300 400)
echo ${arr[*]}							#显示所有数组元素
echo ${arr[@]}							#同上
echo ${#arr[*]}							#显示数组或者数组元素的长度
arr[0]=500								#给数组第一个元素赋值
c=(${arr[*]:1:2})						#从第一个元素开始取两个元素,必须包含括号,否则就不是数组
unset arr[2]                            #删除第三个元素,但是其他元素位置不变,如果希望得到一个重新序列数组,则arr=(${arr[*]})
arr+=( 500 )                            #追加一个新的元素
  • 执行命令
$(echo nihao)							#将标准输出赋值给变量a

(a=b ; c=d ;echo $a$c)					#打开一个子bash执行,变量将不会被父级理解,但可以引用父级变量

双小括号

  • 数学运算,不支持浮点型
((n=5,i=n,i++))							#可以支持多个运算,可以省略$变量符号
var=$((n++))							#进行运算后赋值
((i<5)) || echo no						#如果不小于5则 输出no,说明作为一个标准输出执行
echo $((8#11))							#11的格式是8进制,转成10进制后为9

单中括号

作为判断使用前注意前后保持一个空格

  • 字符比较实用“== !=”,数学比较 “-eq -gt”,< > 符号必须转义才能使用,中括号与test 功能等同
  • 多条件判断时使用: -a -o
  • 在array中中括号表示数组中的一个元素
[ 1 -eq 1 -a 1 == 2 ] && echo yes			# 多条件判断

双中括号

作为判断使用前注意前后保持一个空格

  • 括号内的表达式看做一个单独的元素,退出后返回一个状态
  • 多条件判断时使用:&& ||
  • 支持正则表达式而不需要引号 (sh不支持)
[[ a == b && c == c ]] || echo '不等于'
[[ 123 =~ [:alnum:] ]] || echo '不等于'

花括号(sh不支持)

mkdir -p {ex3,ex4}.sh					#大括号文件名扩展
{ a=35;b=30;((a+=b));}					#与小括号类似,但是不生成子bash,余下脚本可以引用内部变量;左边需要留空格,最后需要加冒号
  • 变量检查
test ${ab:-value} == value					#通常判断ab是否定义来决定后面的操作
: ${ab:=abc}								#通常给变量赋默认值
test ${ab:+abc} == abc						#与- 功能相反
test ${ab:?does not exists}					#如果没有定义ab变量则将问号后面的字符作为错误输出并退出bash
  • 变量匹配截断与替换
a=abcdcefab							#以下均不改变变量本身
echo ${a%c*b}							#结果为abcd,从右边开始最短匹配,如果满足则删除
echo ${a%%c*b}						#结果为ab,从右边开始最长匹配,满足结果则删除
echo ${a#a*c}							#结果为dcefab,从左边开始最短匹配,如果满足则删除
echo ${a##a*c}						#结果为efab,从左边开始最长匹配,如果慢则则删除

arr=(100 200 300)
echo ${arr[@]/100/bbb}						#将含有100的元素用bbb字符串来替换
echo ${arr[@]//100/bbb}						#将所有100的元素用bbb字符串来替换

bash中的特殊变量

  • 特殊字符
^								#字符开头
$								#字符结尾
&&								#前面条件成立则执行后面的命令
||								#前面条件失败则执行后面的命令
#!								#执行脚本的默认脚本
\								#逃逸字符
''								#逃逸字符
<								#将右边文件输入到左边
>								#将左边输出到右边文件,如果不存在则创建
>>								#追加到右边的文件
<<								#将字符输入到左边
``								#与$()相同
!!								#上一个命令
.*								#代表任意字符
|								#管道符号,或者是或
  • 系统变量
$_                                                       #返回上一个命令的最后一个参数
$@                                                #所有双引号内的参数算一个
$*                                                    #所有参数算一个
$#                                                #参数的数量,引号内的参数算一个
$?								#前一条命令返回的结果
$!								#后台命令的进程ID
$PPID								#父进程ID
$$								#当前bash进程ID
$UID								#用户ID	
$USER								#当前用户
$BASH_VERSION							#bash版本号
$HOSTNAME							#主机名
$OLDPWD								#上次目录
$PWD								#当前目录
$RANDOM								#返回0-32767中的一个数字
$SECONDS							#bash运行的时长
$HISTFILE							#用户历史命令路径
$HISTSIZE							#用户历史命令最大记录条数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值