shell常⽤语法巨巨巨详解
HelloWorld
#! /bin/bash  # ⽤于指定运⾏脚本默认的解释器
echo"Hello World!"# echo是打印语句
注释
# 单⾏注释
:<<EOF
第⼀⾏注释
第⼆⾏注释
第三⾏注释
EOF
其中多⾏注释中的EOF可以替换成其他任意的字符串, 例如
:<<abc
第⼀⾏注释
第⼆⾏注释
第三⾏注释
abc
:<<!
第⼀⾏注释
第⼆⾏注释
第三⾏注释
!
变量
定义变量
name1='abc'# 单引号定义字符串
name2="abc"# 双引号定义字符串
name3=abc  # 不加引号也可表⽰字符串
使⽤变量
使⽤变量,需要加上$符号,或者${}符号。花括号是可选的,主要为了帮助解释器识别变量边界。
name=abc
echo$name# 输出abc
echo${name}# 输出abc
echo${name}hello # 输出abchello
# echo $namehello 这种写法就是错误的
只读变量
使⽤readonly或者declare可以讲变量变为只读。
name=abc
readonly name
declare -r name  # 两种写法均可
name=cde  # 尝试修改只读变量,报错
删除变量
unset可以删除变量。
name=abc
unset name
echo$name# 输出空⾏
1. ⾃定义变量(局部变量)
⼦进程不能访问的变量
2. 环境变量(全局变量)
⼦进程可以访问的变量
⾃定义变量改为环境变量
环境变量改为⾃定义变量
字符串
字符串可以⽤单引号,可以⽤双引号,也可以不⽤引号
单引号与双引号的区别:
单引号中的内容会原样输出,不会执⾏、不会取变量
双引号中的内容可以执⾏、可以取变量
name=abc
echo'hello, $name \"hh\"'
echo"hello, $name \"hh\""
运⾏结果如下图:
获取字符串长度
name=abc
echo${#name}# 输出3
提取⼦串
name="hello, abc"
echo${name:0:5}# 提取从0开始的5个字符
默认变量
在执⾏shell脚本时,可以向脚本传递参数。$1是第⼀个参数,$2是第⼆个参数,以此类推。特别的是$0是该脚本的⽂件名(包括路径)。
echo"⽂件名: "$0
echo"第⼀个参数: "$1
echo"第⼆个参数: "$2
其他特殊变量
参数说明
$#代表传⼊的参数个数
$*由所有参数构成的⽤空格分开的字符串,如上例给出的$1 $2,各个参数合并成了⼀个不可分割的整体$@每个参数分别⽤双引号扩起来的字符串,如上例给出的"$1" "$2",各个参数仍然保持其独⽴性$$脚本当前的运⾏ID
$?上⼀条命令的退出状态。0表⽰正常退出,其他值表⽰错误。
$(command)返回command这条命令的stdout(可嵌套)
`command`返回command这条命令的stdout(不可嵌套)
#!最近⼀次后台进程的ID号
数组
数组中可以存放多个不同类型的数据,只⽀持⼀维数组,初始化时不需要指明数组⼤⼩。
数组下标从0开始。
定义
数组⽤⼩括号表⽰,元素之间⽤空格隔开。例如
array=(1 abc "def" aaa)
也可以直接定义数组中某个元素的值
array[0]=1
array[1]=abc
array[2]="def"
array[3]=aaa
使⽤
格式:
${array[index]}
例如:
array=(1 abc "def")
echo${array[0]}
echo${array[1]}
echo${array[2]}
若要直接使⽤整个数组:
${array[@]}# 第⼀种写法
${array[*]}# 第⼆种写法
例如:
array=(1 abc "def")
echo${array[@]}# 第⼀种写法
echo${array[*]}# 第⼆种写法
shell脚本返回执行结果
获取长度
${#array[@]}
${#array[*]}
例如
array=(1 abc "def")
echo${#array[@]}# 第⼀种写法
echo${#array[*]}# 第⼆种写法
expr命令
expr命令⽤于求表达式的值,格式为:
expr表达式
表达式说明:
⽤空格隔开每⼀项
⽤转义符放在shell特定的字符前⾯
对包含空格和其他特殊字符的字符串要⽤引号括起来
expr会在stdout中输出结果。如果为逻辑关系表达式,结果为真stdout为1,否则为0。
expr的exit code:如果为逻辑关系表达式,则结果为真,exit code为0,否则为1。
字符串表达式
length STRING
返回STRING的长度
index STRING CHARSET
CHARSET中任意单个字符在STRING中最前⾯的字符位置,下标从1开始。如果在STRING中完全不存在CHARSET中的字符,则返回0.
substr STRING POSITION LENGTH
返回STRING字符串中从POSTION开始,长度最⼤为LENGTH的⼦串。如果POSITION或LENGTH为负数,0或者⾮数值,则返回空字符串。
⽰例:
str="Hello World!"
echo`expr length "$str"`# 输出12
echo`expr index "$str" awd`# 输出7,下标从1开始
echo`expr substr "$str"23`# 输出 ell
整数表达式
expr⽀持普通的算术操作,算术表达式优先级低于字符串表达式,⾼于逻辑关系表达式。
+ -
加减运算。两端参数会转换为整数,如果转换失败则报错。
* / %
乘,除,取模运算。两端参数会转换为整数,如果转换失败则报错。
()可以改变优先级,但是需要⽤反斜杠转义。
⽰例:
a=3
b=4
echo`expr $a + $b`# 输出7
echo`expr $a - $b`# 输出-1
echo`expr $a \* $b`# 输出12,*需要转义
echo`expr $a / $b`# 输出0,整除
echo`expr $a % $b`# 输出3
echo`expr\( $a + 1\)\* \( $b + 1\)`# 输出20,值为(a + 1) * (b + 1)
逻辑关系表达式
|
如果第⼀个参数⾮空且⾮0,则返回第⼀个参数的值,否则返回第⼆个参数的值,但要求第⼆个参数的值也是⾮空或⾮0,否则返回0。
如果第⼀个参数是⾮空或⾮0时,存在逻辑短路现象(第⼆个参数不会被计算)。
&
如果两个参数都⾮空且⾮0,则返回第⼀个参数,否则返回0。如果第⼀个参数为0或为空,则不会计算第⼆个参数。
< <= = == != >= >
⽐较两端的参数,如果为true,则返回1,否则返回0。"==“是”="的同义词。"expr"⾸先尝试将两端参数转换为整数,并做算术⽐较,如果转换失败,则按字典序进⾏⽐较。
()可以改变优先级,需要⽤反斜杠转义
⽰例:
a=3
b=4
echo`expr $a \> $b`# 输出0,>需要转义
echo`expr $a '<' $b`# 输出1,也可以将特殊字符⽤引号引起来
echo`expr $a '>=' $b`# 输出0
echo`expr $a \<\= $b`# 输出1
c=0
d=5
echo`expr $c \& $d`# 输出0
echo`expr $a \& $b`# 输出3
echo`expr $c \| $d`# 输出5
echo`expr $a \| $b`# 输出3
read命令
read命令⽤于从标准输⼊中读⼊单⾏数据。当读到⽂件结束符时,exit code为1,否则为0。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。