Shell笔记

Shell笔记

变量的使用

定义变量

定义变量直接 变量名=值

注意

  1. =号左右不能有空格,不然认为变量名为shell命令
  2. 值可以为任意类型,想写什么就写什么,而且在后面可以随意更改类型

使用变量

使用变量需要用$标识

name="corbin"
echo $name

也可以使用{}包围(推荐)

name="corbin"
echo ${name}    

只读变量

只读变量 使用readonly定义变量即可

name="jay"
readonly name

删除变量

删除变量 使用unset定义变量即可

name="jay"
unset name  

Shell中的变量

字符串

字符串 单引号标识

str='this is a string'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

字符串 双引号标识

str=“this is a string”

双引号的优点:

  • 双引号里可以有变量

  • 双引号里可以出现转义字符

字符串的操作
  • 获取字符串的长度

    str="abce"

    echo ${#str}

  • 提取子字符串

    str="this is a string"

    echo ${str:1:4}

上面demo从第二个字符开始截取一共4个字符

数组

使用()括号来标识数组,数组元素使用"空格"分割开。只支持一维数组,不支持多维数组,类似于C语言,数组元素的下标由0开始

array_name=(value0 value1 value2)

也可以使用回车

aray_name=(
value0
value1
value2
)

还可以单独定义每一个分量

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用连续的下标,而且下边没有范围限制

数组的操作
  • 读取数组

    ${array_name[n]}

  • 读取所有元素

    ${array_name[@]}

  • 获取数组长度

    echo ${#array_name[*]} or echo ${#array_name[@]}

  • 获取数组的子串

    echo ${array_name:1:4}

类似于获取字符串的字串,上面的demo获取从第二个开始的一共4个元素

其他变量

Shell中还有整数,浮点数等,但是没有其他语言里面的布尔值

使用注释

shell中的注释为# Shell中没有多行注释

Shell 传递参数

我们在执行Shell脚本的时候,往往会传递一些参数,获取这些参数的和使用变量的方式类似,使用$n,n=1,2,3...代表第一二三个参数,$0 代表执行的文件名

t.sh文件

echo "文件名为:${0}"
echo $1
echo ${2}
echo ${3}

传递参数的方法为,执行

sh ./t.sh value1 value2

上面demo没有第三个参数,会打印空

一些额外的参数

参数处理    说明

$#  传递到脚本的参数个数

$*  以一个单字符串显示所有向脚本传递的参数。

如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$$  脚本运行的当前进程ID号

$!  后台运行的最后一个进程的ID号

$@  与$*相同,但是使用时加引号,并在引号中返回每个参数。

如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

$-  显示Shell使用的当前选项,与set命令功能相同。

$?  显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

Shell脚本运行需要可执行权限,所以要使用chmod命令来给予可执行权限

chomd u+x t.sh

Shell 基本运算符

不支持简单的数学运算,需要使用命令来计算,eg:awk和expr.

两个数相加(使用的是反引号`)

val=`expr 2 + 2`
echo "2+2=${val}"

注意

  • 表达式和运算符之间需要空格,比如2+2是不对的,必须为2 + 2

  • 表达式需要被``(反引号)包含

    运算符 说明 举例

    + 加法 expr $a + $b

    - 减法 expr $a - $b

    * 乘法 expr $a \* $b

    / 除法 expr $b / $a

    % 取余 expr $b % $a

    = 赋值 a=$b 将把变量 b 的值赋给 a。

    == 相等。用于比较两个变量,相同则返回 true。如[ $a == $b ]

    != 不相等。用于比较两个变量,不相同则返回 true。如[ $a != $b ]

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

a=1
b='1'
if [ $a == $b ]
then
    echo "a = b"
else
    echo "a != b"
fi
输出为:a = b

[]与[[]]的区别

[]实际上是bash 中 test 命令的简写。即所有的 [ expr ] 等于 test expr
对 test 命令来说, 用 -eq 要进行数字比较.

[[ expr ]] 是bash中真正的条件判断语句,其语法更符合编程习惯 (比如 &&, || 的用法),在 [[ ]] 中的,任何需要整数,但是提供的确又是其他不能转换成整数的字符串,都变成了0。 所以应该保证自己代码中的需要用到整数的时候,总是提供整数。

逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

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

字符运算符

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

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符 说明  举例
-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。

流程控制

if elseif else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for循环

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

while循环

while condition
do
    command
done
while无限循环
while :
do
    command
done

while true
do
    command
done

until 循环

until condition
do
    command
done

case语句

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

跳出循环

break

break命令

break命令允许跳出所有循环(终止执行后面的所有循环)。

continue

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

Shell 函数

demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

定义一个带有return语句的函数:

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

带参数的函数示例

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 变量使用$variable, ${variable_a} 输出到屏幕echoecho -e 对字符串中转义字符进行...
    mrwrong1988阅读 667评论 0 49
  • 基础 头文件 #!/bin/bash 或者#!/bin/sh #!约定的标记,如IOS的Import 执行文件时需...
    ZMJun阅读 1,232评论 1 2
  • 一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工...
    架构师小秘圈阅读 8,725评论 3 70
  • 01 一位大三的小姑娘与我聊天,整个晚上都在跟我倒苦水,各种室友不和谐、学习压力大、毕业迷茫感,甚至还有食堂饭菜不...
    午后呓语阅读 5,075评论 139 285
  • 突然接到前男友D的女友的电话,说什么D和她分手了,又在嗨粉.问我她应该怎么办。这不是当初我想要的结果吗?可为什么...
    余笙都是你阅读 330评论 0 0