shell-变量,字符串,数组,注释,参数传递
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}
- 查找子字符串
使用反引号定义其语句
查找字符e
或s
的位置(哪个字母先出现就计算哪个)
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-变量,字符串,数组,注释,参数传递的更多相关文章
- Linux-Shell基础(变量,字符串,数组)
一. 什么是shell shell是一个用C语言编写的程序,它是用户使用Linux的桥梁,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统 ...
- shell重温---基础篇(shell变量&字符串以及git GUI运行shell脚本方式)
既然是基础篇那肯定是需要对shell的各种需要注意的基本点进行说明了.接下来就是show time... shell呢,是一个用C语言编写的应用程序,是用户使用linux的桥梁.所以呢,他既是一 ...
- [java变量] - 字符串数组转long型数组
//定义字符串 String str = "1,3,6,9,4,2,1,6"; //截取字符串 String[] strArr = str.split(",") ...
- shell循环字符串数组
#!/bin/bash arr=("0" "1" "2" "3" "4" "5" ...
- shell变量、函数和数组以及字符串的截取
一.变量 1.shell变量名 (1)可以由字母.数字.下划线等字符组成.但是第一个字符必须是字母或者下划线. (2)若果变量中包含下划线(_)则要特别注意,$project_svn_$date.ta ...
- shell变量,字符串,数组
一.shell变量定义: 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头: 中间不能有空格,可以使用下划线: 不能使用标点符号: 不能使用bash里的关键字. 变量使用: 使用一个定义过的 ...
- shell 分割字符串存至数组
shell 分割字符串存至数组 shell编程中,经常需要将由特定分割符分割的字符串分割成数组,多数情况下我们首先会想到使用awk但是实际上用shell自带的分割数组功能会更方便.假如a=”one,t ...
- shell变量定义与数组-1
1.查看系统所有shell和默认shell 查看系统所有的shell: cat /etc/shells 查看系统默认shell: echo $SHELL 2.第一个shell脚本,打印字符串Hello ...
- Shell初学(二)变量及数组
精简版: 定义:your_name=123 PS:=符号左右不能有空格! 使用:${your_name},单独使用变量时可以不加{} 只读:readonly your_name PS:设置 ...
随机推荐
- pip command not found
[root@ Python-2.7.9]# pip install jinja2 -bash: pip: command not found 解决 [root@ ~]# yum -y install ...
- 判断是否是IE浏览器
设置IE版本的页面渲染<meta http-equiv="x-ua-compatible" content="ie=EmulateIE8">con ...
- pypdf2:下载Americanlife网页生成pdf合并pdf并添加书签
初步熟悉 安装 pip install pypdf2 合并并添加书签 #!/usr/bin/env python3.5 # -*- coding: utf-8 -*- # @Time : 2019/1 ...
- python第三方库安装
如安装jieba分词库 代码对Python 2/3均兼容 全自动安装:easy_install jieba或者pip install jieba / pip3 install jieba 半自动安装: ...
- demo(一) react-native-router-flux
react-native init AwesomeProject cd AwesomeProject 安装模块 npm i react-native-router-flux --save
- 利用pyltp进行实体识别
一.实体识别作为信息抽取中基础的也是重要的一步,其技术可以分为三类,分别是其于规则的方法.其于统计模型的方法以及基于深度学习的方法. 基于规则的方法,主要依靠构建大量的实体抽取规则,一般由具有一定领域 ...
- Nginx访问非常慢
由于域名绑定服务器IP,而服务器上部署了多个应用,想都通过域名访问,故弄了个Nginx转发. 加了Nginx以后,服务访问明显卡顿. 查看配置: location / { proxy_pass htt ...
- django 快速实现注册(四)
一.创建项目与应用 #创建项目fnngj@fnngj-H24X:~/djpy$ django-admin.py startproject mysite3fnngj@fnngj-H24X:~/djpy ...
- spring boot打包以及centos下部署
spring boot打包以及部署 一.打包 springboot的打包方式有很多种.有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的.这里主要介绍如何打成j ...
- ARP 之 发送请求arp_solicit
概述 arp_solicit用来发送ARP请求,首先会根据ARP_ANNOUNCE参数来选取源地址,然后判断是否达到内核发送次数上限,未达到则调用内核arp_send_dst函数发送,如果达到上限,则 ...