学习内容:https://www.linuxdaxue.com/series/linux-shell-series/

个人笔记如下

1、“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一个Shell来执行。

ex:

#!/bin/bash
echo "Hello World !"

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

或者通过chmod 775 ./test.sh

或者直接执行bash test.sh

3、交互式输入通过read

#!/bin/bash
echo "What is your name?"
read PERSON
echo "Hello, $PERSON"

4、Shell将其中任何设置都看做文本字符串。有两种变量,本地和环境。

定义变量:

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量:$变量,使用变量的时候才加美元符($)

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用;unset 命令不能删除只读变量。

使用set命令显示所有本地定义的Shell变量

5、Shell特殊变量,$0, $#, $*, $@, $?, $$

名称 含义
$0 当前脚本的文件名
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会单独讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前进程的ID。对于 Shell 脚本,就是这些脚本所在的进程ID
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2

$* 和 $@ 的区别

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

6、Shell字符串的操作

加单引号的特点:

  • Shell单引号里的任何字符都会被原样输出,单引号字符串中的变量无效;
  • Shell单引号字串中不能出现单引号(对单引号使用转义符也不行)。

加双引号的优点:

  • Shell双引号里可以有变量
  • Shell双引号里可以出现转义字符
myweb='CSDN'
str="Hello, you are browsing \"$myweb\"! \n"
表达式 含义
${#string} $string的长度
${string:position} 在$string中, 从位置$position开始提取子串
${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串
${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring

shell 字符串下标同python。从0开始编号,

${test##*/},${test%/*} 分别是获取文件名,或者目录地址最简单方法。

字符串的替换

test='c:/windows/boot.ini'
echo ${test/\//\\}
echo ${test//\//\\}

7、Shell数组

在Shell中,用括号来表示数组,数组元素之间用“空格”分割开。array_name=(value1 ... valuen)

${array_name[index]},使用@ 或 * 可以获取数组中的所有元素

8、echo命令使用单引号“’”可以保持原样输出,不会对内容进行处理

printf使用同C的printf,Shell printf命令与C语言printf命令的区别。

  • printf 命令不用加括号
  • format-string 可以没有引号,但最好加上,单引号双引号均可。
  • 参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。
  • arguments 使用空格分隔,不用逗号。
printf "%d %s\n" 1 "abc"
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"
# 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
$ printf "The first program always prints'%s,%d\n'" Hello Shell

9、

Shell 有三种 if else格式:

  1. if ... then... fi 格式
  2. if ... then... else ... fi 格式
  3. if ... then... elif ...then ... else ... fi 格式

if ... else 语句也可以写成一行,以命令的方式来运行,像这样:

if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;

test 命令用于检查某个条件是否成立,与方括号([ ])类似。

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
thenecho 'The two numbers are equal!'
elseecho 'The two numbers are not equal!'
fi

10、

for 变量 in 列表
docommand1...commandN
done

列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的值依序放入指定的变量中,然后重复执行命令区域(在do和done 之间),直到所有元素取尽为止。

可以显示当前目录下的文件

for file in ./*
doecho $file
done

11、while

COUNTER=0
while [ $COUNTER -lt 5 ]
doCOUNTER=`expr $COUNTER+1`echo $COUNTER
done

lt ---小于

while read txt1
doecho ${txt1}
done < /home/study/study/infile

说明:这个例子使用read在标准输入读取数据,放入变量txt1中,如果读到的数据非空,就进入循环。然后在循环中把该行数据显示出来。最后一样是输入重定向,将/home/study/study/infile的内容作为此脚本的标准输入。

注:>是输出内容到某个文件,>>是内容追加到文件中,

命令默认从键盘获得的输入,重定向(<)后改为从文件,或者其它打开文件以及设备输入。这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

until和while类似,不同在于command 如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

ex:

COUNTER=0
until [ ! $COUNTER -lt 5 ]
doCOUNTER=`expr $COUNTER + 1`echo $COUNTER
done

12、Shell分支语句case···esac语法

case 值 in
模式1)command1command2command3;;
模式2)command1command2command3;;
*)command1command2command3;;
esac

case后为取值,值后为关键字 in,接下来是匹配的各种模式,每一模式最后必须以右括号结束。

值可以为变量或常数。

模式支持正则表达式,可以用以下字符:

*       任意字串
?       任意字元
[abc]   a, b, 或c三字元其中之一
[a-n]   从a到n的任一字元
|       多重选择

匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。

;; 与其他语言中的 break 类似,意思是不执行接下来的语句而是跳到整个 case 语句的最后。

*)与default相似,如果上面没有匹配到的模式,则执行*)里的内容。

13、Shell Select语句语法

select name   [in   list ]
do statements that can use  $name...
done

说明:select首先会产生list列表中的菜单选项,然后执行下方do…done之间的语句。用户选择的菜单项会保存在$name变量中。

PS3='Please choose your number: ' # 设置提示符字串.
echo
select number in "one" "two" "three" "four" "five"
do  echo  echo "Your choose is $number."    echo  break
done
exit 0

14、shell function

Shell 函数的定义格式如下:

[ function ] funname [()]
{command;[return int;]
}

说明:function 关键词是可选项,可加可不加。

大括号内饰函数体,最后是返回值,可以加【return】关键词来指定函数返回内容,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)。

在Shell中,调用函数时可以向其传递参数。

在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数,$0代表脚本本身。

参数 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
function fSum()
{echo "入参为:"$1,$2return $(($1+$2))
}
fSum 5 7
total=$(fSum 3 2)
echo "Return :"$total,$?

这个定义了一个计算参数和的函数,函数可以通过$1,$2这种形式来获取入参值,然后通过$(($1+$2))这种形式来将两值相加,并返回结果。

调用时,也可以通过括号的形式来调用,Shell会调用单括号里面的命令。 因此,我们可以将shell中函数,看作是定义一个新的命令,它是命令,因此 各个输入参数直接用 空格分隔。

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

15、输出重定向的详细说明

命令格式 命令说明
Command > filename 把标准输出重定向到一个文件中
Command > filename 2>&1 把标准输出和错误一起重定向到一个文件中
Command 2 > filename 把标准错误重定向到一个文件中
Command 2 >> filename 把标准输出重定向到一个文件中(追加)
Command >> filename2>&1 把标准输出和错误一起重定向到一个文件(追加)

上文中已经说到,Linux文件描述符中,2代表标准错误。现在讲下如何将标准错误进行重定向。

使用方法:

command > out.put 2>&1
将command执行的标准输出和标准错误重定向到out.put(也就是说不管command执行正确还是错误,输出都打印到out.put)。

还可以将错误输出重定向到/dev/null,意思是丢弃这部分输出,如下:

command 2> /dev/null
如果command执行出错,将错误的信息重定向到空设备(忽略掉错误输出)

16、Shell文件包含就是在一个文件调用另外一个文件,使用点号“.”+文件名 或者source+文件名

ex:

num1.sh

num1=1
num2=2

num2.sh

. num1.sh
echo "num1 = "$num1
echo "num2 = "$num2

linux shell 学习小结相关推荐

  1. linux sh 必要,Linux Shell学习之基础篇(不适合学习,仅为本人笔记)

    在学习Linux和OpenStack过程中,感觉不管是大规模部署部署还是运维,Shell脚本都已经是标配,所以学好脚本很有必要. 以下仅为Linux Shell的一些基础笔记,这里作为笔记记下. == ...

  2. Linux| |Shell学习

    Shell学习 # 符号 1. 初识 1.1 Shell定位 Shell就是用C编写的程序,是用户是用Linux的桥梁.Shell就是Linux内核的一个外壳,调用内核的接口 1.2 Shell和Ba ...

  3. 【转】十分有用的linux shell学习总结

    在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们 数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...

  4. 鸟哥linux+韩顺平linux视频教程学习小结

    linux的特点 优点: 1.免费的/开源的系统 2.支持多线程/多用户的系统 3.安全性好 4.对内存和文件管理优越 linux体积最少只需要内存4M,由于小所以可以做嵌入式开发 缺点: 操作相对困 ...

  5. Linux+shell学习记录和思维导图

    由于shell和Linux学习分不开,所以干脆一起结合起来学习,顺便用思维导图工具做一个记录. 学习的关键在于对着教程敲代码. 学习工具 思维导图工具Xmind:以前一直用百度脑图做一些简单的记录,但 ...

  6. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务

    1. 处理信号 1.1 Linux 信号 常见的 Linux 信号如下表所示: 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 终止进程 3 SIGQUIT 停止进程 9 SIGKILL ...

  7. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  8. Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)

    1. 命令行参数 向 shell 脚本传递数据的最基本方法是使用命令行参数.命令行参数允许在运行脚本时向命令行添加数据. $ ./addem 10 30 本例向脚本 addem 传递了两个命令行参数( ...

  9. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)

    1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...

最新文章

  1. android联动动画,利用 CollapsingToolbarLayout 完成联动的动画效果
  2. 是什么限制了区块链技术的应用?
  3. 2018年前35名Python面试问题和答案
  4. android开发rn插件,在Android原生应用中嵌入React Native
  5. 用python画qq表情_用Python编写提取QQ表情的脚本
  6. Executor框架
  7. 推荐的版本 lock 语句(C# 参考)
  8. Bug接口地址找不到
  9. python爬虫获取中国天气网天气数据 requests BeautifulSoup re
  10. find命令基本使用一览
  11. stm32代码_ME3616 NB-IoT模组对接OneNET教程以及STM32代码
  12. vue.js 添加 fastclick的支持
  13. redis stream持久化_带你彻底理解 Redis 持久化
  14. 「分块系列」数列分块入门6 解题报告
  15. 用印审批移动办公用户手册
  16. 手机桌面隐藏大师_【应用隐藏大师app】应用隐藏大师安卓版_应用隐藏大师手机版下载v2.8.1 - 绿点安卓网...
  17. 微信公众号小程序怎么做 微信公众号小程序制作教程
  18. 怎么用wps抽签_“excle 如何摇号“如何参与摇号?
  19. 为何淘宝上的假货打不完?
  20. 如何成为一个优秀的测试工程师

热门文章

  1. Linux du命令和df命令区别
  2. 数据挖掘十大算法--K-均值聚类算法
  3. python零碎知识(8):UserDict 类
  4. Matplotlib实例教程(三)折线图 plt.plot()
  5. Python编程基础:第四节 类型转换Type Cast
  6. 【算法数据结构Java实现】折半查找
  7. 解构电商产品——订单系统(一)
  8. Spring Remoting: Remote Method Invocation (RMI)--转
  9. 【Excel】VBA自动化更新数据表格
  10. 风控评分卡建模全流程