Linux的Shell有很多种,常见的有Bourne Shell Bourne Again Shell C Shell K Shell Shell for Root

等,其中Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用,本系列文章就是基于B Shell进行探究的

linux命令集成

之前所讲的的linux命令,例如ls,cat,mkdir等等,都可以在shell里面得到执行

这里补充几个之前没提到但又比较有用的命令

  • 查看文件最后num行

    tail -n num filename

  • 查看文件最开始的num行

    head -n num filename

  • 改变创建目录的默认权限(使用777减去设置的值就是默认的权限)

    umask 026

  • 改变文件的所属

    chown user.group filename

    chown user filename

    chown .group filename

shell命令简单示例

#!/bin/bash
echo "Hello Shell"

以上就是一个简单的shell脚本示例

新建文件,按约定一般shell脚本后缀名为sh,这并不是一定的,因为Linux对于文件的识别并不是通过后缀名

后缀名对于Linux并没有作用,这样写是为了方便,算是一种行业规定,并非一定

文本开头的#!是一个约定的标记,用来告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell

echo 命令用于向窗口输出文本

shell可以直接运行,也可以作为输入源来运行

直接运行的话,需要将sh脚本赋予执行权限

作为输入源,需要使用/usr/sh来执行

前一种方式比较常见

Shell 变量

变量说明

在shell中,变量名和其他编程语言类似,变量名遵循字母数字下划线,数字不能开头

变量不需要指定类型,定义即可

key="test"

这里有一点值得注意,在其他编程语言中,往往为了美观,会在赋值号左右加上空格,而在shell中这样的做法是不可以的

变量赋值

在shell中,变量的赋值有两种方式

显示的赋值,例如

key="test"

语句赋值,shell可以使用其他语句的结果为变量赋值

for file in `ls /etc`

变量使用

使用一个变量,在变量名前面添加$符号,表示要获取这个变量的值

key="test"
echo $key

当变量与其他混合在一起,可以使用{}定义变量的边界

key_1="test1"
key_2="test"
echo ${key_1}{key_2}

此处如果不对边界加以区分,那么编译器将$以后当作变量,其输出的结果就不是预期值了

变量的一些细节

定义过的变量可以重新赋值

这也很好理解,在一般编程语言里面,变量的定义需要类型,再次赋值则不需要,而在shell里面是没有这种规定的,那么定义一个变量以后,要修改这个变量的值,那么只能和定义看上去一样了,从这个角度来说,有些资料说变量可以重定义,我认为说法是不准确的,这里准确来说应该是赋值

key="test1"
echo $key
key="test2"
echo $key

只读变量与删除变量

变量可以为只读,只需在前面加上readonly即可,只读变量的值一旦被定义,那么就不能修改

key="test"
readonly key

变量可以被删除,使用unset删除一个变量

删除的变量不能再被使用

key="test"
unset key

注意:unset不可以删除只读变量

Shell 字符串

字符串可以用单引号,也可以用双引号,也可以不用引号

单引号

单引号类的字符会保持原样,怎么写的就怎么用

例如存在变量key,在单引号中存在$key,那么他就是一个$key,与key变量没有任何关系

string='string test'

反引号一般也用于命令的执行,其等价于$()

双引号

双引号与单引号最大的区别在于单引号不可以有变量,而双引号可以,同时还可以存在转义字符

string="string test"

单双引号都可以对字符串进行拼接

key=" key "
str1="test"$key"ok"
str2="test${key}ok"
str3='test'$key'ok'

字符串操作

  • 获取字符串长度

    使用字符串的同时,在字符串变量前面加上#可以获取其长度
string="test"
echo ${#string}
  • 提取子字符串

    在要提取的字符串后面加上:可以获取其字串
string="test"
echo ${string:1:2}
  • 查找子字符串

    使用反引号定义其语句

    查找字符es的位置(哪个字母先出现就计算哪个)
string="test"
echo `expr index "$string" es`

Shell 数组

bash只支持一维数组(不支持多维数组),没有限定数组的大小

和其他语言一样,其可以通过下标来得到数组值,下标从0开始

定义数组

数组名=(值1 值2 ... 值n)

数组值之间通过空格隔开

testarr=(1 2 3 4)

其下标可以不连续,没有范围限制

读取数组

${数组名[下标]}

和一般变量使用类似

key=${test_arr[0]}

可以使用*@来获取数组中的所用元素

echo ${test_arr[*]}
echo ${test_arr[@]}

获取数组的长度

数组长度

len=${#test_arr[@]}
len=${#test_arr[*]}

元素长度

len=${#test_arr[n]}

Shell 注释

单行注释

shell通过#进行注释

#这是一个注释
#这也是一个注释

多行注释

shell中的多行注释,使用:<<开始,其后面添加一个标志,然后在注释完成的地方再加一个同样的标志

:<<EOF
test
test
test
EOF

Shell 参数传递

Shell脚本在执行的时候可以对其传递参数

可以使用$n对其传递的参数接收

例如执行test.sh 1 2 3,在test.sh内可以使用$0代表程序本身,$1代表第一个参数

这和C语言main函数的参数接收是一样的

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ $*相同,但是使用时加引号,并在引号中返回每个参数
$- 显示Shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

shell-变量,字符串,数组,注释,参数传递的更多相关文章

  1. Linux-Shell基础(变量,字符串,数组)

    一. 什么是shell shell是一个用C语言编写的程序,它是用户使用Linux的桥梁,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统 ...

  2. shell重温---基础篇(shell变量&字符串以及git GUI运行shell脚本方式)

    既然是基础篇那肯定是需要对shell的各种需要注意的基本点进行说明了.接下来就是show time...    shell呢,是一个用C语言编写的应用程序,是用户使用linux的桥梁.所以呢,他既是一 ...

  3. [java变量] - 字符串数组转long型数组

    //定义字符串 String str = "1,3,6,9,4,2,1,6"; //截取字符串 String[] strArr = str.split(",") ...

  4. shell循环字符串数组

    #!/bin/bash arr=("0" "1" "2" "3" "4" "5" ...

  5. shell变量、函数和数组以及字符串的截取

    一.变量 1.shell变量名 (1)可以由字母.数字.下划线等字符组成.但是第一个字符必须是字母或者下划线. (2)若果变量中包含下划线(_)则要特别注意,$project_svn_$date.ta ...

  6. shell变量,字符串,数组

    一.shell变量定义: 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头: 中间不能有空格,可以使用下划线: 不能使用标点符号: 不能使用bash里的关键字. 变量使用: 使用一个定义过的 ...

  7. shell 分割字符串存至数组

    shell 分割字符串存至数组 shell编程中,经常需要将由特定分割符分割的字符串分割成数组,多数情况下我们首先会想到使用awk但是实际上用shell自带的分割数组功能会更方便.假如a=”one,t ...

  8. shell变量定义与数组-1

    1.查看系统所有shell和默认shell 查看系统所有的shell: cat /etc/shells 查看系统默认shell: echo $SHELL 2.第一个shell脚本,打印字符串Hello ...

  9. Shell初学(二)变量及数组

    精简版: 定义:your_name=123      PS:=符号左右不能有空格! 使用:${your_name},单独使用变量时可以不加{} 只读:readonly your_name  PS:设置 ...

随机推荐

  1. [Javascript] Customize Behavior when Accessing Properties with Proxy Handlers

    A Proxy allows you to trap what happens when you try to get a property value off of an object and do ...

  2. Luogu P4198 楼房重建 分块 or 线段树

    思路:分块 提交:2次(第一次的求解有问题) 题解: 设块长为$T$,我们开$N/T$个单调栈,维护每一块的上升斜率. 修改时暴力重构整个块,$O(T)$ 求解时记录一个最大斜率$lst$,然后块内二 ...

  3. 【luoguP1991】 无线通讯网--最小生成树

    题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...

  4. 图论小专题C

    3 负环及其应用 3.1 判定算法 判断负环只能用"边松弛"算法,也就是Bellman-Ford和SPFA算法.这两个算法都是\(O(NM)\)级别的.因为负环中一定存在一条负边, ...

  5. Navicat Premium 12 卸载和注册表的删除

    卸载就不用我说了,win10也好,win7也好直接windows设置里的卸载,或者你觉得别的软件卸载的比较干净也行 不过还是不会删掉注册表,甚至文件夹都不删除, ... 这是卸载 ,在此说一下,为了安 ...

  6. CodeForces Good Bye 2016

    A题,水题略过. B题,也水,但是想复杂了.只要运动超出[0,20000]的范围就算不可能了. C题,我自己的方法是解不等式,然后取最大的答案即可.代码如下: #include <stdio.h ...

  7. Namenode服务挂

    BUG修复:HDFS-13112 这两天排查了小集群Crash的问题,这里先总结下这两天排查的结果 一.查看日志 首先查看了Namenode Crash的时候的日志 (一)以下是patch hdfs- ...

  8. 使用editcap.exe分割pcap文件

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  9. Nginx-HTTP之静态网页访问流程分析二

    11. HTTP 阶段执行 下面会依次执行以下阶段: NGX_HTTP_SERVER_REWRITE_PHASE: 在将请求的 URI 与 location 表达式匹配前,修改请求的 URI (所谓重 ...

  10. 【软件工程】Beta冲刺(1/5)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 tomcat的学习与实现 服务器后端部署,API接口的beta版实现 后端代码 ...