shell数组等基本用法
- "shell"既是一种解释型编程语言,也是一个这种编程语言的解释器的名字
- shell是解释型语言,就是解释器会一条一条的翻译每一条语句并执行,对比之下,C语言是编译型语言,编译器把整个工程编译成可执行文件才能执行
- 在没有续行符(
\回车
)的情况下,shell脚本的一条语句以"回车"为结束 - 任何一个shell脚本程序都必须在开头用
#!
标识使用的shell程序,如果用的是bash,那就是#!/bin/sh
- shell脚本一行中的
#
之后的部分为注释 - 刚刚写完的一个shell script程序通常是没有执行权限的,需要手动$chmod +x filename.sh来添加可执行权限
- shell语言本身并不包含linux内置的命令,那些命令本质上都是一个可以在shell环境中执行的程序,只是在shell环境中执行shell脚本可以调用这些程序而已。
特殊符号
$
表示取结果。和变量名一起使用表示取变量的值,和()
一起使用表示取命令群组的执行结果
$tunset=123
$echo "$tunset"
123
$echo $(ls Downloads)
lukas-h.github.io-theme.zip youdao-dict_1.1.0-0-deepin_amd64.deb
( )
- 表示在"nested sub-shell"中划分一个命令群组(command group),如果我们希望里面的命令对之前和之后的设定不影响的话,就要用
()
,反之,如果需要在当前shell(non-named command group)中执行相关命令,就要用{}
表示命令群组。 - 在数学计算中就是数学中的
()
- 定义数组
$cat shell.sh;./shell.sh
#!/bin/bash
line="123 25 36532 454"
(
line="wwww"
echo "$line"
)
echo "$line"
wwww
123 25 36532 454
$arr=(0 1 2 var) #定义一个数组
$echo "${arr[0]}" #显示数组下标为0的元素
0
{ }
- 用作范围限定
- 标明在"non-named command shell"中执行的命令群组。shell函数就是使用
{}
的特性来定义的 - 配合
:
,-
,+
,=
,#
,/
,%
,?
对变量进行操作
$echo $var
123
$echo $variable
$echo ${var}iable
123iable
$cat shell.sh;./shell.sh
#!/bin/bash
line="123 25 36532 454"
{
line="wwww"
echo "$line"
}
echo "$line"
wwww
wwww
$file=/opt/ros/jade/include/image_view/ImageViewConfig.h
#匹配+删除
$echo ${file#*/} #从左侧开始匹配符合模式最短部分,将其剔除,返回剩下的
opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file#*/*/}
ros/jade/include/image_view/ImageViewConfig.h
$echo ${file##*/} #从左侧开始匹配符合模式的最长部分,将其剔除,返回剩下的
ImageViewConfig.h
$echo ${file%/*} #从右侧开始匹配符合模式的最短部分,将其剔除,返回剩下的
/opt/ros/jade/include/image_view
$echo ${file%%/i*} #从右侧开始匹配符合模式的最长部分,将其剔除,返回剩下的
/opt/ros/jade
#按个数返回
$echo ${file:0:4}
/opt
$echo ${file:4:9} #将第4个字符当作第1个,计数9个, 返回
/ros/jade
#匹配+替换
$echo ${file/opt/root} #将file中的第一个opt替换为root
/root/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file//i/++} #将file中的所有i都替换为++
/opt/ros/jade/++nclude/++mage_v++ew/ImageV++ewConf++g.h
#根据变量状态操作,
$echo ${file-fault} #只要设定了,就返回file,否则返回fault
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file1-fault}
fault
$echo ${file:-fault} #只要设定了且非空,就返回file,否则返回fault
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file+fault} #只要设定了,就返回fault
fault
$echo ${file:+fault} #只要设定了且非空,就返回fault
fault
$echo ${file=fault} #只要file没设定,就将fault赋值给file并返回
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file1}
$echo ${file1=fault}
fault
$echo ${file1}
fault
$echo ${file:=fault} #只要file没设定或非空,就将fault赋值给file并返回
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file?fault} #只要file没设定,就将fault输出至STDERR
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file:?fault} #只要file没设定或为空,就将fault输出至STDERR
#统计字符数
$echo ${file}
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${#file}
50
(( ))
用作计算,shell支持十进制/十六进制/二进制的+ - * / % & += -= *= /= %= ++ -- 等算术运算,以及| ^ ! > >= < <= !=等逻辑运算。同样的效果也可以使用expr ...
来实现,但是expr是Linux的内置软件,并不是shell语言的关键字
$echo $((1 + 2))
3
$echo $((0xf + 1))
16
$cal=132
$echo $(($cal+1))
133
[ ]
- 用作取数组元素,使用
${arr[n]}
访问数组编号为n的元素
$arr=(0 1 2 var)
$echo "${arr[0]}"
0
$echo "${arr[3]}"
var
` `
两个反单引号表示命令替换,和$()
是等价的。个人觉得看着比$()
清晰,但是如果多层嵌套的话可能需要转义,此时就没有$()
看着易懂。在下面的嵌套结构中,我们本意是先执行cmd3,将执行结果传给cmd2,再将结果传给cmd1
cmd1 `cmd2 `cmd3``
但是其实被解析成了下面这个
cmd1 `cmd2`cmd3 ``
为了解决这个问题,我们需要使用转义字符,写成下面这个样子才能正确的传达我们的意思
cmd `cmd2 \`cmd3\``
但如果我们使用$()
,就可以让代码更清晰
$echo `echo`echo 12`` #被分解成了 echo `echo` echo 12``
echo 12
$echo `echo \`echo 12\`` #这个才对
12
$echo $(echo $(echo 12)) #这个才对
12
|
管道表示将前一个命令的返回结果用作后一个命令的参数,管道的前后必须都是命令,管道是管理Linux十分有用的工具
$grep "test" file1.txt | wc -l
> >>
>
以新建的方式重定向,如果文件不存在就创建文件并将内容写入,如果文件存在就把文件清空再写入内容>>
以追加的方式重定向,如果文件不存在就创建文件并将内容写入,如果文件存在就在原文件后面写入内容
<
我们通常的操作就是文件,其实已经使用的输入重定向
2>
- 标准输入,标准输出,标准错误其实是三个完全不同的文件,虽然我们看起来标准输出和标准错误都输入到显示屏中显示,但是不能用输出重定向将错误重定向到其他文件
- 标准输入,标准输出,标准错误的文件描述符分别是0,1,2,这也是错误重定向
2>
的由来
&&
&&
前的命令执行成功了就继续执行后面的命令
||
||
前的命令执行失败了就去执行后面的命令
;
不论;
前的命令执行成功与否都去执行后面的命令
关键字
readonly
相当于C中的const,readonly将变量设为只读模式,任何针对他们的赋值都是错误的
$readonly var=123
$var=345
bash: var: readonly variable
unset
删除变量
unset var_name 删除变量var_name
unset -v first middle last 删除其他变量
unset -f fcn 删除函数
$tunset=123
$echo $tunset
123
$unset tunset
$echo $tunset
$
shift
用来截去来自列表的位置参数,从左侧开始,一旦执行shift,$1
的初始值就会永远消失,取而代之的是$2
的旧值,依次类推,$#
的值也会依次减1
shift也可以带一个参数,表示一次截取的个数
$cat shell.sh
#!/bin/bash
echo "${1}"
shift
echo "${1}"
$./*.sh 123 456
123
456
set
设置新的位置参数
$set qq ww ee
$echo "${1}"
qq
$echo "${0}"
bash
$echo "${2}"
ww
$echo "$#"
3
export
添加变量到变量导出列表,即如果在shell中执行子shell,该变量将作为环境变量从而在子shell中变得可以使用。
$cat shell.sh
#!/bin/bash
echo "$NEWENV"
$NEWENV=123
$./shell.sh
$export NEWENV
$./shell.sh
123
exit
提前结束标本
1、使用&符号在后台执行命令(用户退出则命令终止)
./XX.sh &
2、使用nohup在后台执行命令(用户退出命令不终止)
nohup ./XX.sh &
3、使用screen重新连接会话
4使用watch连续地执行一个命令(类似js中的定时器)
watch df -h
shell数组等基本用法的更多相关文章
- centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课
centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件.目录属性 shell数组简单用法 $( ) 和$ ...
- (转)轻松掌握shell编程中数组的常见用法及示例
缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...
- (转)Shell中read的用法详解
Shell中read的用法详解 原文:http://blog.csdn.net/jerry_1126/article/details/77406500 read的常用用法如下: read -[pstn ...
- Linux Shell系列教程之(六)Shell数组
本文是Linux Shell系列教程的第(六)篇,更多shell教程请看:Linux Shell系列教程 Shell在编程方面非常强大,其数组功能也非常的完善,今天就为大家介绍下Shell数组的用法. ...
- Shell基础(四):字符串截取及切割、字符串初值的处理、基使用Shell数组、expect预期交互、使用正则表达式
一.字符串截取及切割 目标: 使用Shell完成各种Linux运维任务时,一旦涉及到判断.条件测试等相关操作时,往往需要对相关的命令输出进行过滤,提取出符合要求的字符串. 本案例要求熟悉字符串的常见处 ...
- Linux Shell 数组
shell 数组一般都是一维数组. 1. 数组的声明 declare -a arr 该命令将声明一个数组arr,实际上不声明也可以直接定义数组. 2. 数组的初始化 arr=(1 2 3):该命令定义 ...
- shell--2.shell数组
shell 数组 (1)定义数组 shell中,用括号表示数组,数组元素用空格分开,定义数组的一般形式 arrt_name=(val1 val2 val3) 或者 arry_name=(val1 va ...
- Linux Shell数组常用操作详解
Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...
- Shell数组例子
Shell数组例子 循环打印数组,并统计数组的个数: [root@slavedb array]# cat a.sh #!/bin/bash array=( freddy freddie tang sh ...
随机推荐
- Linux 下 解压zip文件出现乱码
网上下载了一个文件,鼠标右键提取出来发现中文文件名全部乱码: 打开命令行 unzip -h 可以看到 -O 参数 制定编码解压: 比如: unzip -O CP936 xxx.zip
- excel 公式 insert 语句
="insert into tb_fdn_deviceaccount (zdmc,czmc,sbbh,sbmc,SZCS,SBFLMC,SBLXMC,SBGG,SBYZ,SBJZ,SBXH, ...
- JavaScript简单简介
JavaScript,男,web页面的一种脚本编程语言,1955年诞生,妻子为HTML,魔法能力是将静态页面(经过与用户交互与相应)转变为动态页面. 刚进入浏览器市场(魔界)的时候,也就是js1.0岁 ...
- 当进行数据查询时候 要考虑创建一个model ;具备传入与输出的字段
当进行数据查询时候 要考虑创建一个model ;具备传入与输出的字段
- poj2739(尺取法+质数筛)
题意:给你一个数,问这个数能否等于一系列连续的质数的和: 解题思路:质数筛打出质数表:然后就是尺取法解决: 代码: #include<iostream> #include<algor ...
- servlet篇 之 servlet的访问
三:servlet的访问 使用web.xml文件中的这个<url-pattern>标签中的映射路径,来访问servlet 6.1 在浏览器的地址栏中,直接输入servlet映射的路径来访问 ...
- Spring 使用介绍(七)—— Spring事务
一.数据库事务概述 1.基本介绍 事务必需满足ACID(原子性.一致性.隔离性和持久性)特性,缺一不可: 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做 ...
- BZOJ3513[MUTC2013]idiots——FFT+生成函数
题目描述 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. 输入 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个 ...
- Basic remains POJ - 2305 同余模 高精度处理
题意 给出B(10以内大于0)进制下 p (1000位以内)和m(9位以内) 求 p%m 在b进制下等于什么 思路: 可以计算 1e9不会溢出Int所以m在int值以内 先求m 要处理p 每 ...
- 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树
题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...