Linux shell知识点汇总_linux shell

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

引言

SHELL在处理一些问题的时候有得天独厚的优势,快捷方便,学会了还可以显摆显摆,当然了,shell的语法有点坑爹,没有系统的学过,只能一点一点的积累。

今天这个是在实现一个刷新数据库数据的脚本的时候碰到的一些知识点,刷新的时候用到了正则匹配、数学运算、比较等等。

shell中的数组

数组的定义

arr=(1 2 3 4 5)
arr=(燕睿涛 yrt lulu yanruitao)
arr=('^[0-9]+$' '^yrt\.(\d+)\.log$')
arr=(
 "燕睿涛" \
  "yanruitao" \
  "today is a good day!"
)

数组的使用

len=${#arr[@]} #返回的是数组元素的个数
echo ${arr[0]} #数组中的第一个元素,这个和其他语言的数组类似,下表从0开始
echo ${arr[2]} #数组中的第3个元素

实际的例子

[yanruitao@boss_runtime sh]$ arr=(
> "燕睿涛"
> "http:\/\/www\.baidu\.com\/(\d+)\.html"
> "yanruitao"
> "lulu"
> "yrt"
> )
[yanruitao@boss_runtime sh]$ echo ${#arr[@]}
5
[yanruitao@boss_runtime sh]$ echo ${arr[1]}
http:\/\/www\.baidu\.com\/(\d+)\.html
[yanruitao@boss_runtime sh]$ echo ${arr[0]}
燕睿涛
[yanruitao@boss_runtime sh]$ echo ${arr[5]}

[yanruitao@boss_runtime sh]$

shell中的大小比较

#第一种(())
if((6 <8)); then echo "yes 燕睿涛"; fi #输出——yes 燕睿涛
if(($a>8)); then echo "yes 燕睿涛"; fi
if(($a<=$b)); then echo "yes 燕睿涛"; fi
#第二种[] [[]]
if [ 2 -gt 1 ]; then echo "iforever 燕睿涛"; fi
if [[ 'abc' > 'ab' ]]; then echo "iforever 燕睿涛"; fi #iforever 燕睿涛
if [[ 2 < 10 ]]; then echo "iforever 燕睿涛"; fi #无输出
if [[ 2 -lt 10 ]]; then echo "iforever 燕睿涛"; fi #iforever 燕睿涛

可以看到上面这几种还是有些规律的:

双小括号[(())]里面是可以直接使用大于小于号进行比较(>、<、<=、>=),而且不需要“坑爹”的空格,用于数学计算
单中括号([])里面比较必须使用-gt、-lt、-ne、-eq这些运算符,而且必须要有严格的空格要求
双中括号([[]])里面比较可以使用>、<、-gt、-lt......这两种格式,但是还是必须要有严格的空格要求,而且双中括号中的>、<对类似于字符串的比较,所以在使用的时候需要注意

shell中的括号

#看看小括号的用法,首先是在for循环里面,相当于还是数学计算
[yanruitao@boss_runtime ad]$ for((a=0;a<10;a++))
> do
> echo $a
> done
0
1
2
3
4
5
6
7
8
9

#对变量进行++,还是相当于数序运算
[yanruitao@boss_runtime ad]$ i=1
[yanruitao@boss_runtime ad]$ echo $i
1
[yanruitao@boss_runtime ad]$ let i++
[yanruitao@boss_runtime ad]$ echo $i
2
[yanruitao@boss_runtime ad]$ ((i++))
[yanruitao@boss_runtime ad]$ echo $i
3

#数学运算
[yanruitao@boss_runtime ad]$ echo 1+2
1+2
[yanruitao@boss_runtime ad]$ echo $((1+2))
3

#单括号里面是一个命令组,括号中的命令将会新开一个shell顺序执行,所以这个里面相当于一个封闭的空间,里面的变量什么的不能被剩余代码使用
[yanruitao@boss_runtime ad]$ a=1
[yanruitao@boss_runtime ad]$ (a=3;echo $a)
3
[yanruitao@boss_runtime ad]$ echo $a
1

#括号中and的使用
if [[ -n "$ret" && $ret -gt 123 ]]... #[[]]双中括号中只能使用&&,不能使用-a
if [ -n "$ret" -a $ret -gt 123 ]...  #[]单中括号中只能使用-a,不能使用&&
if(($ret)) && (($ret >123 ))...  #(())双小括号使用&& 

shell中函数的定义

function getId()
{
 local url=$1 #local限定了变量url的作用域只在函数里面,不然会污染全局的作用域
  ereg="http:\/\/www\.baidu\.com\/\([0-9]\+\)\.html"
  local ret=$(expr $url : $ereg)
  if [[ -n "$ret" && $ret -gt 0 ]]; then #当ret为null时使用[]会报错,-n这里的双引号一定要加上,不然当$ret为null时,一直返回真
   echo $ret
    return 0
  fi
  return 1
}
[yanruitao@boss_runtime sh]$ echo $?
0
[yanruitao@boss_runtime sh]$ getId "http://www.baidu.com/123.htl"
[yanruitao@boss_runtime sh]$ echo $?
1
[yanruitao@boss_runtime sh]$ getId "http://www.baidu.com/123.html"
123
[yanruitao@boss_runtime sh]$ echo $?
0

函数的整体形式如上面的例子,这里面注意两点:

首先就是返回值,通过return的返回值只能是整数,并且在调用完成之后使用echo $?可以查看返回值。
要使用赋值的形式需要有echo,就像ret=$(getId "http://www.baidu.com.1234.html"),只有echo的值会传递给ret变量。

杂项知识点

字符串转数组

[yanruitao@boss_runtime sh]$ str="燕睿涛 lulu yrt yanruitao"
[yanruitao@boss_runtime sh]$ arr=($str)  #这一步将字符串转化为了数组
[yanruitao@boss_runtime sh]$ echo ${arr[*]}
燕睿涛 lulu yrt yanruitao
[yanruitao@boss_runtime sh]$ echo ${#arr[@]}
4

常用判断标志
[ -z STRING ]  “STRING” 的长度为零则为真。 
[ -n STRING ] or [ STRING ]  “STRING” 的长度为非零 non-zero则为真。
[ -d FILE ]  如果 FILE 存在且是一个目录则为真。
[ -a FILE ]  如果 FILE 存在则为真。

linux后台运行相关

& #在一个命令的最后加上这个命令,可以将该命令放到后台执行
./update.sh 100 500 &

ctrl + z #讲一个正在前台执行的命令放到后台,并且处于暂停状态

jobs #查看当前后台运行的命令
jobs -l #可以显示所有后台任务的PID
[yanruitao@boss_runtime sh]$ jobs -l
[1]  9681 Running         ./t.sh 100 300 &
[2]  9683 Running         ./t.sh 100 300 &
[3]- 9685 Running         ./t.sh 100 300 &
[4]+ 9688 Running         ./t.sh 100 300 &

fg  #把后台中的命令调至前台继续运行,如果后台有多个命令可以使用`fg %jobnumber`将选中命令调出
[yanruitao@boss_runtime sh]$ jobs -l
[2] 10033 Running         ./t.sh 100 300 &
[3] 10035 Running         ./t.sh 100 300 &
[4]- 10037 Running         ./t.sh 100 300 &
[5]+ 10039 Running         ./t.sh 100 300 &
[yanruitao@boss_runtime sh]$ fg %2
./t.sh 100 300  

bg  #讲一个在后台暂停的命令变成在后台继续执行。同样,如果有多个命令,可以使用bg %jobnumber
[yanruitao@boss_runtime sh]$ jobs -l
[1]- 11655 Running         ./t.sh 100 300 &
[2]+ 11662 Running         ./t.sh 100 300 &
[yanruitao@boss_runtime sh]$ fg %1
./t.sh 100 300
^Z
[1]+ Stopped         ./t.sh 100 300
[yanruitao@boss_runtime sh]$ jobs -l
[1]+ 11655 Stopped         ./t.sh 100 300
[2]- 11662 Running         ./t.sh 100 300 &
[yanruitao@boss_runtime sh]$ bg %1
[1]+ ./t.sh 100 300 &
[yanruitao@boss_runtime sh]$ jobs -l
[1]- 11655 Running         ./t.sh 100 300 &
[2]+ 11662 Running         ./t.sh 100 300 &

kill #终止进程
kill %num #通过jobs查看的job号,进行杀死
kill pid #通过进程号杀掉进程
ctrl + C #终止当前前台的进程

以上所述就是本文的全部内容了,希望能够对大家熟悉Linux shell命令有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索linux
shell
shell 知识点、shell编程知识点总结、九年级英语知识点汇总、小学语文知识点汇总、说明文知识点汇总,以便于您获取更多的相关知识。

时间: 2024-10-10 16:37:30

Linux shell知识点汇总_linux shell的相关文章

linux shell 管道命令(pipe)使用及与shell重定向区别_linux shell

看了前面一节:linux shell数据重定向(输入重定向与输出重定向)详细分析 估计还有一些朋友是头晕晕的,好复杂的重定向了.这次我们看下管道命令了.shell管道,可以说用法就简单多了. 管道命令操作符是:"|",它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard error 信息没有直接处理能力.然后,传递给下一个命令,作为标准的输入 standard input. 管道命令使用说明: 先看下下面图: comma

积累linux常用命令大全_linux shell

本人记忆力有限,就把平时在项目中遇到的linux常用命令分享给大家. Linux常用命令全集 http://www.jb51.net/linux/ linux文件中存在^M 使用shell命令tr可以实现去除,具体命令如下: 复制代码 代码如下:   cat -v yourfile | tr -d "^M" > targetfile VIM中选定某个单词 在ESC之后,使用w或者wi或者vwi可以选择某个单词 在控制台中快速移动光标 1.删除 1.1 ctrl + d 删除光标所

更改linux用户登录shell的操作方法_linux shell

1.查看机器安装了哪些shell? 有两种方法可以查看. 第一种: [rocrocket@wupengchong ~]$ chsh -l  /bin/sh /bin/bash /sbin/nologin /bin/zsh 第二种: [rocrocket@wupengchong ~]$ cat /etc/shells  /bin/sh /bin/bash /sbin/nologin /bin/zsh 其实chsh -l也是来查看这个文件. 2.查看当前正在使用的shell是哪个? [rocrock

Linux下一些常用的Shell脚本整理_linux shell

如何计算当前目录下的文件数和目录数         # ls -l * |grep "^-"|wc -l ---- to count files # ls -l * |grep "^d"|wc -l ----- to count dir         如何只列子目录?     ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux) ls -l | grep "^d" 或

一天一个shell命令 文本操作系列-linux dd使用教程_linux shell

今天第一天写,先说下写shell脚本的基本知识 1. shell脚本以.sh 为扩展名,通常运行 ./${filename}.sh 或者 sh ${filename}.sh 2. shell 脚本开头以 #!/bin/bash #!读作 "shebang" 3. 开启调试  #!/bin/bash –xv 4. /dev/null 任何东西丢进去都会消失,linux黑洞. /dev/zero 用于初始化,会产生0 今天先介绍 dd 命令 由来(全称):本来应根据其功能描述"C

分享一个入门级可控多线程shell脚本代码_linux shell

说到shell可控多线程,网上分享的大部分是管道控制的方案.这种方案,张戈博客也曾经实战并分享过一次:<Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点>,感兴趣的朋友可以看看. 分享一个入门级可控多线程shell脚本方案 下面张戈博客再分享另一种更容易理解的入门级可控多线程shell脚本方案:任务切割.各个击破. 先来 1 段场景描述: 某日,在鹅厂接到了这个任务,需要在Linux服务器中,对几千个IP进行一次Ping检测,只要取得ping可达的IP就好.如果单个IP去pi

判断文件是否存在的shell脚本代码_linux shell

实现代码一. #!/bin/sh # 判断文件是否存在 # link:www.jb51.net # date:2013/2/28 myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" # 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 if [ ! -x "$myPath"]; then mkdir "$myPath" fi # 这里的-d

实战模拟监控MySQL服务shell脚本小结_linux shell

1)端口判断法==>仅适合数据库本地使用 法1:if条件判断方法 [root@oldboy scripts]# cat check_db01.sh #!/bin/sh #created by oldboy #mail:oldboy521@gmail.com PortNum=`netstat -lnt|grep 3306|wc -l` if [ $PortNum -eq 1 ] then echo "mysqld is running." else echo "mysql

基础的Linux Shell技巧小结_linux shell

一.自动补齐:[Tab] 这个技巧很多人都应该会了,就是当输入命令,目录或者是文件名的时候按 [Tab] 键.系统就会帮你补齐可能要输入的东西,如果有多个选择系统会列表出来.你可以看清楚之后再多输入一个或多个 charactor ,再按[Tab]. 实验: $ ec 按[Tab], 补齐为: $ echo 二.查找和执行历史命令:[Ctrl + r], [Ctrl + p], [Ctrl + n] 在终端中按捉 [Ctrl] 键的同时 [r] 键,出现提示:(reverse-i-search),