Shell脚本学习
admin
2024-01-20 15:12:42
0

一、介绍

shell是一个用C语言编写的程序,是使用Liunx的桥梁。shel既是一种命令语言,又是一种设计语言,它提供一个界面(小黑屏),用户通过这个界面访问操作系统内核的服务。

在我们通常说的shell一般说的是shell script(shell脚本)。但学习者还是需要知道shell 和shell script两者是不同的概念。由于习惯问题,所以shell都是指shell脚本编写。

shell编程和JavaScript、PHP一样,除了文本编辑外就只需要一个能解释执行的脚本解释器就可以了。Linux的shell种类有很多,常见的有

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)

二、初识Shell脚本

shell脚本扩展名为sh,但实际扩展名并不影响脚本执行,见名知意就好。

#!/bin/bash
echo "Hello World !"
  • 文件开头说明

    #! 是shell的约定标记,它告诉系统这个脚本需要什么解释器执行,#!/bin/bash 代表Bash方式执行。

  • 授权为可执行程序

    chmod +x ./test.sh  #使脚本具有执行权限
    
  • 执行

    ./test.sh # 或者指定解释器运行,这种方式不需要在第一行指定解释器信息,指定了也没用。
    /bin/sh ./test.sh
    

三、shell变量

3.1、声明变量

test_name="xiaoMing"

变量名和等号之间不能有空格。

  • 直接声明变量名,不用加其他符号
  • 变量名只能使用英文、数字和下划线,且不能以数字开头

3.2、使用变量

test_name="xiaoMing"
echo $your_name
# 推荐使用这个
echo ${your_name}

加大括号可以帮助解释器识别变量边界,所以推荐所有变量名都加上大括号,这是个编程的好习惯

3.3、设置只读变量

test_name="xiaoMing"
readonly  $your_name

如果将变量设置为只读,后面重新赋值,在运行时就是执行报错: /bin/sh: NAME: This variable is read only.

3.4、删除变量

unset variable_name

3.5、变量类型

运行shell时,会同事存在三种变量

  • 局部变量

    局部变量在脚本或者命令中定义,仅在当前shell实例中有效

  • 环境变量

    所有的程序,包含shell启动的程序,都能访问的环境变量

  • shell变量

    shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

四、Shell字符

4.1、单引号

str='123'

单引号里不能引用变量名,除非单引号里再嵌套个单引号里引用变量。并且不是出现一个单引号,除非成对出现,作为字符串拼接

4.2、双引号

hi="Hello World"
name="${hi} shenyao"
echo ${name}

使用双引号的优点

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

4.3、拼接字符

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"# 使用单引号拼接
greeting_2='hello, '$your_name' !'

4.4、获取字符长度

string="abcd"
echo ${#string}   # 输出 4

4.5、截取字符

name="123";
name2=${name:0:2} //12
  • 截取字符,一个是从哪个开始截取,第二个数代表要截取多少个

五、数组

shell数组支持一维数组,并且没有限制数组的大小,可以通过索引访问元素。

5.1、数组定义

  • 直接声明

    array_name=(value0 value1 value2 )array_name=('111' '2222 22' '3333')
    
  • 换行

    array_name=(
    value0
    value1
    value2
    )
    
  • 可以单独定义各个值

    array_name[0]=value0
    array_name[1]=value2
    
  • 不仅可以使用索引赋值,也可以用任意字符来关联元素

    首先使用declare 关键字声明为关联数组

    declare -A array_namearray_name["google"]="www.google.com"
    array_name["runoob"]="www.runoob.com"
    array_name["taobao"]="www.taobao.com"
    

5.2、读取数组

${数组名[索引下标]}value=${array_name[0]}#@符号获取所有元素
values=${array_name[@]}

5.3、获取数组长度

获取字符串长度时使用${#string} ,数组长度也类似使用#

length=${#array_name[@]}
#或者
length=${#array_name[*]}

六、传递参数

在运行shell脚本时,有时我们需要在执行脚本时传递参数。脚本内获取参数的格式为:$n。n代表一个数字,其中$0代表里执行的文件名,从1开始才是真正传的参数,$1代表第一个传递的参数,$2代表第二个传递的参数

例如

#执行脚本
./test.sh 1 2 3# 脚本内容
#!/bin/bas
echo "shell 传递参数示例开始"
# 执行的文件名
echo "执行的文件名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"shell 传递参数示例开始
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2

其他引用列表

参数说明
$#传递参数的个数
$*传递的所有参数
$$脚本运行的当前进程ID号
$@$*相同,但是传参的时候需要使用引号括起来,否则它就当成一个参数

七、基本运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如:awk,expr,let最常用。

val=`expr 2 + 2`

注意
1、表达式何运算符质检要有空格,例如2+2是不对,要 2 + 2,

2、表达式要用``包裹起来,

let s=(2+4)*4

注意

1、运算符和参数之间不能有空格
2、与expr对比,let命令更简洁直观
3、let使用位操作符<< >>&需要用\ 来转义

7.1、算术运算符

运算符说明
+加法
-减法
*乘法
/除法
%取余
=赋值
==判断相等,用于比较两个数字,相同返回true。只能用于数字类型且在if判断中使用
!=判断不相等,不相同则返回 true。

7.2、关系运算符

该运算符只支持数字

运算符说明
-eq检查两个数是否相等
-ne不相等
-gt大于
-lt小于
-ge大于等于
-le小于等于

7.3、布尔运算符

运算符说明
!非运算,取反的作用
-o或运算,相当于`
-a且运算,相当于&,两个表达式为true才返回true

7.4、逻辑运算符

运算符说明
&&and
||OR

7.5、字符串运算符

运算符说明
=两个字符串是否相等
!=是否不相等
-z长度是否为0
-n长度是否不为0
$是否不为空

7.6、文件测试运算符

操作符说明
-d file文件是否是目录
-r file是否可读
-w file是否可写
-x file是否可执行
-s file是否为空
-e file文件(包含目录)存在

八、echo命令

echo是一个输出命令,格式如下

echo string

获取控制台输入

read name
echo "${name} 你好"

执行后脚本,name变量作为控制台输入的变量

./test.sh
xiaoMing   #控制台输入
xiaoMing 你好  #输出

九、printf

printf和echo都是输出命令,但printf的脚本比echo移植性高。比如可以传参数

示例

printf "你好吗? %s \n" 小明#打印出来就是
你好吗? 小明
  • 格式化输出

    printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
    
    符号说明
    %s替换符,s声明是字符串的意思
    %-10s指定一个宽度为10个字符,-表示左对齐,没有则右对齐。不满10字符会自动空格值填充,超过也全部显示
    %c%c是输出一个字符
    %f数字类型
    %-5.3f数字类型,占5个字符,超过也展示,保留3位小数

十、流程控制

if判断里可以用[...]((...))。 使用[...] 判断大小用-gt-lt ,使用((...))可以用><

10.1、if

if [条件]
then满足后执行命令
fi

10.2、if…then…else

if [条件]
thenecho '两个数字相等!'
elseecho '两个数字不相等!'
fi

10.3、if…then…elif…

if [条件1]
then满足条件1执行
elif [ 条件2 ]
then满足条件2执行
else都不满足执行
fi

10.4、for循环

  • for in 类型

    for loop in 1 2 3 4 5
    doecho "The value is: ${loop}"
    done
    
    array_name=('一' '二' '三')
    for var in ${array_name[*]}
    doecho "值为: ${var}"
    done
    
  • for i 类型

    fori 模式和其他编程语法差不多

      
    array_name=('一' '二' '三')
    for(( i=0;i<${#array_name[*]}; i++ ))
    doecho "值为: ${array_name[i]}"
    done
    

10.5、while

while [条件]
do执行命令
done

示例

#!/bin/basharray_name=('一' '二' '三')
num=${#array_name[*]}echo "长度为--> ${num}"
while [ ${num} -ge 0 ]
doecho "该值为:${array_name[${num}]}"let "num--"
done

相关内容

热门资讯

大连牙齿矫正一般多少钱,面诊正... 大连牙齿矫正一般多少钱,面诊正畸医生要注意什么?面诊牙齿矫正是一个全面而细致的过程,应当充分准备,与...
财报透视|服不服?银之杰连续亏... 1月14日,银之杰(300085)发布公告,公司预计2025年度归母净利润为负值,公司2025年度经...
现货白银再创历史新高 1月14日,现货白银价格延续2025年以来的强劲涨势,盘中首次突破90美元/盎司大关,最高攀升至91...
海外巨头启示录系列(十七):S... SpaceX 由埃隆・马斯克于 2002 年创立,从初期濒临破产到如今估值达 8000 亿美元(拟 ...
阿斯利康与诺和诺德2026战略... 引言 在全球范围内,肥胖问题日益严重,成为影响人们健康的重要因素。根据世界卫生组织的数据显示,肥胖不...
北京国丹医院郑华国介绍:泛发型... 白癜风是临床常见的顽固皮肤疾病,可发生于任何年龄阶段,全身各部位均可能发病。泛发型白癜风作为其中一类...
股价波动较大!易点天下:15日... 【大河财立方消息】1月14日,易点天下网络科技股份有限公司(简称易点天下)公告称,公司股价波动较大,...
币圈院士:1.15比特币过关斩... 交易的根本是生存,其次才是收益,所以每次操作之前先想清楚自己的操作是否合理,本金是否安全,要形成一套...
专家解读 | 数据应用场景激活... 文 | 北京软件和信息服务业协会 国家数据局会同有关部门研究编制了《工业制造、现代农业等九个领域“数...
2026年十大危机公关公司榜单... 凌晨三点,某上市公司公关总监的手机被一条视频推送点亮。短短15秒的剪辑,将产品质量问题放大成了企业道...
原创 寒... 2025年寒冬的乌克兰,并非末日电影中的场景,而是残酷的现实。当零下十五度的凛冽寒流裹挟着鹅毛大雪,...
白银站稳90美元关口,白银矿业... 来源:环球市场播报 核心要点 现货白银价格于周二首次突破每盎司 90 美元,并在周三交易时段延续...
AI应用端全面爆发!4大黄金赛... 2026年1月14日周三的A股市场,AI应用端彻底点燃全场!浩瀚深度、壹网壹创等多只个股20CM涨停...
FXGT:平台监管合规与全球市... 本文探讨FXGT平台的核心优势,重点分析其监管合规性和全球市场连接的整合价值。通过严格的合规框架,F...
原创 1... 写在文章前的声明:在本文之前的说明:本文中所列的投资信息,只是一个对基金资产净值进行排行的客观描述,...
原创 美... 2026 年 1 月 13 日,美国多家媒体集中披露两条重磅消息,中国美债持仓降至 6887 亿美元...
融资保证金比例重回100%:A... "两融余额突破2.67万亿!"当这个数字刷屏各大财经媒体时,监管层的一纸通知瞬间引爆市场——融资保证...
靠中式精酿9个月狂卖11亿,河... 不到两年时间,一群“微醺女孩”把一家成立44年的河南地方啤酒厂推到IPO门口。 1月13日,河南金星...
原创 黄... 哈喽大家好,今天小无带大家聊聊最近刷屏的抢金热潮!金饰价格飙涨不停,一条项链一夜涨1.5万还被疯抢,...
原创 虚... 小睿就来深扒“纸上黄金”的IPO迷局,Suplay冲刺港股欲成“收藏卡第一股”,靠米哈游IP赚足利润...