SH 语法概要

前端之家收集整理的这篇文章主要介绍了SH 语法概要前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

SH 运行选项 :

-x 输出sh运行时的详细步骤,这个选项将脚本运行期间每一行的具体运行过程显示出来,包括变量的值以及运行了哪些命令之类的,用来做调试非常方便。如果是脚本内部,那么就在第一行加上 “#!/bin/sh -x”,如果是外部,那么直接用 “sh -x [脚本]” 就可以了。

BASH 特殊字符 :

注释.

  • ; 命令分隔符,可以在同一行上写两个或两个以上的命令.

  • ;; 终止case选项.

  • . “点”命令等价于source命令,freebsd不支持source命令,所以这也是脚本中调入其他脚本的方法.
    “点”作为文件名的一部分. 如果点放在文件名的开头的话,那么这个文件将会成为隐藏文件,
    “点”字符匹配. “点”用来匹配任何的单个字符.

  • “” 部分引用[双引号,即”]. “STRING”将会阻止(解释)STRING中大部分特殊的字符.

  • ” 全引用[单引号,即’]. ‘STRING’将会阻止STRING中所有特殊字符的解释. 这是一种比使用”更强烈的形式.

  • ,逗号操作符. 逗号操作符链接了一系列的算术操作. 虽然里边所有的内容都被运行了,但只有最后一项被返回.

  • \ 转义符[反斜线,即]. 一种对单字符的引用机制.

  • / 文件名路径分隔符[斜线,即/],也可以用来作为除法算术操作符.

  • “ 命令替换. 已逐渐被$()替代,后者更灵活,如可以嵌套等

  • : 空命令[冒号,即:]. 也可以被认为与shell的内建命令true作用相同.

  • ! 取反操作符[叹号,即!].

  • * 通配符[星号,即* ]. *可以用来做文件名匹配,也可以用在正则表达式中,用来匹配任意个数(包含0个)的字符.
    算术操作符. 在算术操作符的上下文中,*号表示乘法运算.
    如果要做求幂运算,使用**,这是求幂操作符.

  • ? 测试操作符. 在一个特定的表达式中,?用来测试一个条件的结果.
    在一个双括号结构中,?就是C语言的三元操作符.
    在参数替换表达式中,?用来测试一个变量是否被set了.
    通配符. ?在通配(globbing)中,用来做匹配单个字符的”通配符”.

  • (@H_301_130@).@H_301_189@.@H_502_207@, ”表示行结束符.

  • ${} 参数替换.

  • $* 位置参数

  • $@ 同上.

  • @H_86_301@?退. ?变量保存了一个命令,一个函数,或者是脚本本身的退出状态码.

  • ID.
    变量保存了它所在脚本的进程ID.
  • () 命令组.

  • {} 代码块,又被称为内部组,这个结构事实上创建了一个匿名函数(一个没有名字的函数).

  • [] 条件测试.数组元素.用作正则表达式的一部分,方括号描述一个匹配的字符范围.

  • [[]] 测试.

  • (()) 整数扩展.

  • >

  • &>

  • >&

  • >>

  • <

  • <> 重定向.

  • << 用在here document中的重定向.http://doc.linuxpk.com/doc/abs/here-docs.html#HEREDOCREF

  • <<< 用在here string中的重定向.

  • <

  • > ASCII comparison.

  • \<

  • \> 正则表达式中的单词边界.

  • | 管道.

  • >| 强制重定向(即使设置了noclobber选项 – 就是-C选项). 这将强制的覆盖一个现存文件.

  • || 或-逻辑操作.

  • & 后台运行命令.

  • && 与-逻辑操作.

  • - 选项,前缀.
    用于重定向stdin或stdout[破折号,即-].
    先前的工作目录.
    减号. 减号属于算术操作.

  • = 等号. 赋值操作,”=”也用来做字符串比较操作.

  • + 加号. 加法算术操作.某些命令内建命令使用+来打开特定的选项,用-来禁用这些特定的选项.

  • % 取模. %也是一种模式匹配操作. 在BASH中,%number表示将后台编号为number的任务调度到前台执行。

  • ~ home目录[波浪号,即~].

  • ~+ 当前工作目录. 相当于$PWD内部变量.

  • ~- 先前的工作目录. 相当于$OLDPWD内部变量.

  • =~ 正则表达式匹配. 这个操作将会在version 3版本的Bash部分进行讲解.

  • ^ 行首. 在正则表达式中,“^”表示定位到文本行的行首.

BASH 文件测试

-e 文件存在.
-f 表示这个文件是一个一般文件.
-d 表示这是一个目录.
-b 表示这是一个块设备.
-c 表示这是一个字符设备.
-p 这个文件是一个管道
-s 文件大小不为零.
-L 这是一个符号链接
-S 表示这是一个socket
-t 文件(描述符)被关联到一个终端设备上.
这个测试选项一般被用来检测脚本中的stdin([ -t 0 ]) 或者stdout([ -t 1 ])是否来自于一个终端.
-r 文件是否具有可读权限(指的是正在运行这个测试命令的用户是否具有读权限)
-w 文件是否具有可写权限(指的是正在运行这个测试命令的用户是否具有写权限)
-x 文件是否具有可执行权限(指的是正在运行这个测试命令的用户是否具有可执行权限)
-g set-group-id(sgid)标记被设置到文件或目录上
-u set-user-id (suid)标记被设置到文件
-k 设置粘贴位
-O 判断你是否是文件的拥有者
-G 文件的group-id是否与你的相同
-N 从文件上一次被读取到现在为止,文件是否被修改
! “非” – 反转上边所有测试的结果(如果没给出条件,那么返回真).

BASH 比较操作

————文件比较————

f1 -nt f2
文件f1比文件f2新
f1 -ot f2
文件f1比文件f2旧
f1 -ef f2
文件f1和文件f2是相同文件的硬链接
————整数比较————
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
< 小于
<= 小于等于
> 大于
>= 大于等于
————字符串比较————
= 等于
== 等于
!= 不等号
< 小于,按照ASCII字符进行排序
> 大于,按照ASCII字符进行排序
-z 字符串为”null”,意思就是字符串长度为零
-n 字符串不为”null”.
-l 字符串长度
————逻辑操作————
-a 逻辑与
-o 逻辑或
! 逻辑非

BASH 参数替换

下面的参数扩展中,注意{}中的是变量名,比如一个变量名是 parameter,那么取这个变量的值就用 $parameter,如果希望直接做下面的操作,那么就要用下面的格式了,千万不要变成 ${$parameter}这样的格式,这是很容易犯的错误

————参数扩展————

${parameter} 与$parameter相同,用来强行指定一个变量名,比如 ${parameter}_src.
${parameter-default} 如果变量parameter没声明,那么就使用默认值.
${parameter:-default} 如果变量parameter没设置,那么就使用默认值.
${parameter=default} 如果变量parameter没声明,那么就把它的值设为default.
${parameter:=default} 如果变量parameter没设置,那么就把它的值设为default.
${parameter+value} 如果变量parameter被声明了,那么就使用value,否则就使用null字符串.
${parameter:+value} 如果变量parameter被设置了,否则就使用null字符串.
${parameter?err_msg} 如果parameter已经被声明,那么就使用设置的值,否则打印err_msg错误消息.
${parameter:?err_msg} 如果parameter已经被设置,否则打印err_msg错误消息.

————子串删除————

${#var} 字符串长度(变量$var的字符个数). 对于array来说,${#array}表示的是数组中第一个元素的长度.

${var#Pattern} 从变量$var的开头删除最短匹配$Pattern的子串.

${var##Pattern} 从变量$var的开头删除最长匹配$Pattern的子串.

${var%Pattern} 从变量$var的结尾删除最短匹配$Pattern的子串.

${var%%Pattern} 从变量$var的结尾删除最长匹配$Pattern的子串.

————子串替换————

${var:pos} 变量var从位置pos开始扩展(译者注: 也就是pos之前的字符都丢弃).

${var:pos:len} 变量var从位置pos开始,并扩展len个字符.

${var/Pat/Rep} 使用Rep来替换变量var中第一个匹配Pat的字符串.

${var//Pat/Rep} 使用Rep来替换变量var中的所有匹配Pat的字符串.

${var/#Pat/Rep} 如果变量var的前缀匹配Pat,那么就使用Rep来替换匹配到Pat的字符串.

${var/%Pat/Rep} 如果变量var的后缀匹配Pat,那么就使用Rep来替换匹配到Pat的字符串.

${!varprefix*}
${!varprefix@} 匹配所有之前声明过的,并且以varprefix开头的变量.

BASH 进程替换

>(command)
<(command)

BASH 变量定义

declare用法
-r 只读
-i 整型
-a 数组
-f 函数
-x export 这句将会声明一个变量,并作为这个脚本的环境变量被导出.
-x var=$value 允许在声明变量类型的同时给变量赋值.

BASH 控制结构

—-if结构—-

if  command
then
        command
elif  command
then
        command
else
        command
fi

例:

var=70;
if (($var<60))
then
    echo "too bad"
elif (($var>90))
then
    echo "very good"
else
    echo "OK"
fi

—-case结构—-

case variable in
value1)
        command1
        ;;
value2)
        command2
        ;;
*)
        command3
        ;;
esac

例:

cat << ENDIT
        1)one
        2)two
ENDIT
read choice;
case "$choice" in
1)
        echo "one"
        ;;
2)
        echo "two"
        ;;
*)
        echo "Error"
        ;;
esac

—-for结构—-

for variable int world_list
do
        command
done
例:
for line in ~/*
do
        echo $line;
done

—-while结构—-

while command
do
        command
done
例:
var=1
while ((var<=30))
do
        echo $var
        let "var=var+1"
done

—-函数使用—-

function() {
    ........
}

$1-9 1-9个参数
$# 参数的数量
$@ 所有参数,但是所有参数都是一个字符串
$* 所有参数,但每个参数都是一个单独元素

—-运算命令—-

loop=$(((31-16)/8))
echo $loop

用$(())命令可以进行数学计算

参考原文

原文链接:https://www.f2er.com/bash/392963.html

猜你在找的Bash相关文章