base shell 语法笔记

注释# 注释

单行注释

“#”命令代表单行注释,在任何一行代码前加上”#”及将这行变为注释

# 我是注释

多行注释

多行注释则使用:<

:<<EOF
......
......
.....
EOF

变量

变量定义

变量定义不用加任何符号,直接用[变量名]=[变量值]:

name="jianjian"

命名规则

  • 变量名和变量值与等号之间不能加空格
  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量

使用一个定义过的变量,只要在变量前加上美元符即可

name="jianjian"
echo $name
echo ${name}

花括号是可选的,主要是为了识别变量边界,例如这种情况

ScriptName="Java"
echo "i use ${ScriptName}Script"

不加上花括号则可能识别变量名为$ScriptNameScript

只读变量

给变量加上readonly命令就能把它变成一个只读的变量

name="jianjian"
readonly name

删除变量

给变量加上unset命令就能删除这个变量

name="jianjian"
unset name
# 将不会有任何输出
echo $name 

变量类型

在shell中存在三种变量

  • 局部变量:::局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 环境变量:::所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • shell变量:::shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

字符串

字符串定义

bash中的字符串可以用单引号和双引号,其区别就是,单引号内不能解释变量,而双引号内可以解释变量

name="jianjian"
echo '$name'
echo "$name"

上述代码将输出为:

$name
jianjian

字符串拼接

firstName="im"
lastName="jianjian"
name="${firstName}${lastName}"
echo $name

获取字符串长度

name="imjianjian"
echo ${#name}

查找子字符串

str="oh! Bash is so good!"
echo `expr index "$str" is`
# 将输出7,即在第七位找到is中的s

他找到的是is中的任意一个字符,那个线出现就返回哪个
主义这里使用的是“而不是”,这个符号在exc下面

数组

数组定义

bash支支持一维数组,不支持多维数组
数组的下边从0开始,获取数组时下边可以使用算术表达式
数组用()包裹,每个子元素都用空格分开

#直接定义
arr1=(1 2 3 4)
#单独定义
arr2[0]=1
arr2[1]=2
arr2[2]=3
arr2[3]=4

数组使用

arr=(1 2 3 4)
echo ${arr[0]}

数组长度

获取数组的长度

arr=(1 2 3 4)
echo ${#arr(*)}

获取单个元素长度

arr=(12 22 32 42)
echo ${#arr[0]}

传参

使用方法

我们在使用脚本文件的时候可以向文件中传递一些参数,脚本则可以使用 n n 这 种 方 式 来 获 取 参 数 , 0代表文件名, 1 1 代 表 的 是 第 一 个 参 数 , 2代表第二个参数,以此类推。。。

test1.sh:

#!/bin/bash

echo "文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";

然后用下列代码运行该文件:

bash test1.sh 1 2

输出:

文件名:test1.sh
第一个参数为:1
第二个参数为:2

其他字符

参数处理说明
$#参数个数
$*输出所有的参数
$$当前脚本进程ID
$!后台运行的最后一个进程ID
$@与$*相同,但使用时家加引号
$-现时shell当前选项
$?现时最后命令的退出状态。0表示没有错误,其他表示错误

运算符

算术运算符

bash本身不支持简单的数学计算,需要通过其他命令来实现,例如awk和expr

num=`expr 2 + 2`
echo "和为:${num}"

其他运算符:
设a为10。b为20

运算符说明例子
+加法expr $a + $b 结果为 30。
-减法expr $a - $b 结果为 -10。
*乘法expr $a \* $b 结果为 200。
/除法expr $b / $a 结果为 2。
%取余expr $b % $a 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ a== a == b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ a!= a ! = b ] 返回 true。

关系运算符

关系运算符支支持数字,不支持字符串,除非字符串的值是数字

设a为10。b为20

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ aeq a − e q b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ ane a − n e b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ agt a − g t b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ alt a − l t b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ age a − g e b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ ale a − l e b ] 返回 true。

布尔运算符

设a为10。b为20

运算符说明举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ alt20o a − l t 20 − o b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ alt20a a − l t 20 − a b -gt 100 ] 返回 false。

逻辑运算符

设a为10。b为20

运算符说明举例
&&逻辑的 AND[[ a -lt 100 && a -lt 100 && b -gt 100 ]] 返回 false
||逻辑的 OR[[ a -lt 100 &#124; &#124; a -lt 100 &#124; &#124; b -gt 100 ]] 返回 true

字符串运算符

设a 为 “abc”,b 为 “efg”:

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ a= a = b ] 返回 false。
!=检测两个字符串是否相等,不相等返回 true。[ a!= a ! = b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否为0,不为0返回 true。[ -n “$a” ] 返回 true。
str检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。

文件测试运算符

操作符说明举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。
-p file检测文件是否是有名管道,如果是,则返回 true。[ -p $file ] 返回 false。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true

echo命令

输出普通字符串

echo 用于输出字符串,单双引号的作用不同,双引号中可以输出变量,并且双引号也可以省去

name="imjianjian"
echo 'my name is $name'
echo "my name is $name"
echo my name is $name

输出为:

my name is $name
my name is imjianjian
my name is imjianjian

输出转义字符

echo "\"hello world\""

输出

"hello world"

换行/不换行

# -e 开启转义
:<<EOF
\n 换行
\c 不换行
EOF
echo -e "hello world! \n" 
echo -e "hello world! \c" 

输出定向到文件

echo "hello world" > testFile

printf命令

和echo相比,printf模仿了c语言中的printf()方法,所以移植性更好。printf支持用格式化字符串,定制字符床宽度,对齐等。

语法

printf string [argument]
  • string 为字符串
  • argument 为参数列表

格式替代符

在字符串中使用格式替换符占位,然后通过参数来对应带入,并最终输出对应字符串

printf "%-10s %-8s %-6s\n" 姓名 性别 身高

格式替换符有%s,%d,%c,%f等
%s是替代字符串,-为左对齐,不写则是右对齐。10表示字符串将会在10个字符以内的宽度上显示,不足则会用空格占满,炒出的也会正常显示

转义字符

序列说明
\a警告字符,通常为ASCII的BEL字符
\b后退
\c抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f换页(formfeed)
\n换行
\r回车(Carriage return)
\t水平制表符
\v垂直制表符
\| 一个字面上的反斜杠字符
\ddd表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd表示1到3位的八进制值字符

test命令

test命令用于检测某个条件是否成立,可以用来进行数值比较,字符比较,文件等测试。成立则返回true,否则返回false

数值测试

参数说明
-eq等于则为真
-ne不等于则为真
-gt大于则为真
-ge大于等于则为真
-lt小于则为真
-le小于等于则为真

字符测试

|参数| 说明|
|= |等于则为真|
|!= |不相等则为真|
|-z 字符串| |字符串的长度为零则为真|
|-n 字符串| |字符串的长度不为零则为真|

文件测试

参数说明
-e 文件名如果文件存在则为真
-r 文件名如果文件存在且可读则为真
-w 文件名如果文件存在且可写则为真
-x 文件名如果文件存在且可执行则为真
-s 文件名如果文件存在且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真

流程控制

if

if condition
then
    ...command
fi

if…else

if condition
then
    ...command
else
    ...command
fi

if else-if else

if condition
then
    ...command
elif condition
then 
    ...command
else
    ...command
fi

for

for var in item1 item2 ... itemN
do
    ...command
done

while

while condition
do
    command
done

until

until condition
do
    command
done

case

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

和大部分语言一样,可以支持使用breakcontiune,来跳出循环

函数

语法

[function] functionName[()]
{
    ....
    return ....
}

参数列表

与文件传参类似,函数也是使用相同的语法来传参,取参

test(){
    echo 第一个参数为$1
    echo 第二个参数为$2
    ...
    ...
    ...
    echo 第10个参数为${10}
    echo 参数共有$#个
    echo 输出所有参数 $* 
}

当参数大于10时,参数需要用${n}来获取

函数调用

sun(){
    return `expr $1 + $2`
}

#调用
sun 1 2
echo $?

点用函数后,结果通过$?来获得

输入输出重定向

bash一般会将输入和所产生的输出都发送到终端,如果要将其输出到其他位置,则需要重定向

重定向命令

命令说明
command > file将输出重定向到 file。
command < file将输入重定向到 file。
command >> file将输出以追加的方式重定向到 file。
n > file将文件描述符为 n 的文件重定向到 file。
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m将输出文件 m 和 n 合并。
n <& m将输入文件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入。

输出重定向

command1 > file1

例如:

# 将历史命令输出到history.txt文件中
history > history.txt

输出重定向

command1 < file1

例如:

# 统计users文件的行数
wc -l < users

/dev/null

# 所有被重定向到/dev/null的文件都会被丢弃,可以起到禁止任何输出的作用。
# 可以理解为自动清理的垃圾桶
command > /dev/null

文件引用

和其它语言一样,bash也可以引用外部文件。这样可以把一些公共代码封装到一个独立的文件中。

引用方式

#.和文件名中要有一个空格
. filename 
或
source filename
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值