Shell 基础知识和总结

调试脚本

检查脚本语法错误

bash -n /path/to/some_script

调试执行

bash -x /path/to/some_script

shell里的变量

本地变量:只对当前shell有效;作用范围可以是整个shell程序文件,包括脚本中的函数,对其他的shell无效。
    环境变量:对当前shell及子进程shell有效。
    声明、赋值:export name=value 或者 declare -x name=value
    局部变量:与函数的生命周期一样;
        定义:local name=value
    位置变量:$1,$2,…,表示脚本传入的第几个参数
    特殊变量:$?(上一条命令执行结果代码),$0(当前脚本名称),$#(脚本参数个数)
    注:在用完变量之后要unset 变量名,这是个好习惯。

退出状态

进程使用退出状态来报告命令执行成功或失败

0代表成功,1-255表示失败,系统通过数字来指定特定的错误

$?保存最近的退出状态,用来判断执行命令是否成功

不过我们在脚本里可以自定义退出状态码,用exit [n] 定义

注意:脚本中一旦遇到exit 命令,脚本会立即终止;终止退出状态取决于exit 命令后面的数字
        注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

shell里的算术运算

算术运算符:+,-,*,/,%,** (乘法符号有些场景中需要转义 ,如*),算术表达式里的变量可以不加$,以下是实现算术运算并赋值的几种形式

let var=算术表达式
    注意:let和expr运算符只要后面表达式执行结果为0,会返回错误代码1,写脚本做运算的时候注意!!!
    这里有个特殊例子:let k++ 和 let ++k 前面的返回1,后面的返回0

var=$((算术运算符))
    var=$[算术运算符]
    var=$(expr arg1 运算符 arg2)
    注意:expr数字与运算符之间要有空格,否则会报错,参数除数字之外要加$
    declare -i var=value 声明变量val为数值,感觉这个和普通声明没有太大区别
    echo `算术表达式` | bc
    $RANDOM (0-32767)
    例:echo $[$RANDOM%50] :0-49

shell里的逻辑运算

逻辑运算就与(&&)或(||)非(!)
与:
1 与 与 1 = 1
1 与 与 0 = 0
0 与 与 1 = 0
0 与 与 0 = 0
或:
1 或 或 1 = 1
1 或 或 0 = 1
0 或 或 1 = 1
0 或 或 0 = 0
以上相信大家比较熟悉,下面简单介绍下逻辑短路。
短路与:
第一个为0 ,结果必定为0
第一个为1 ,第二个必须要参与运算
短路或
第一个为1 ,结果必定为1
第一个为0 ,第二个必须要参与运算
shell条件测试

在另一篇博客已经说了基础知识,下面简单说一下要注意的地方
测试命令有3种
test expression
[ expression ]
[[ expression ]]
注意:expression前后必须有空格;值为空或不赋值时结果为假,所有要加上引号。

[[email protected] MyShell]$ [ a=b ] #操作法两边要加上空格,否则系统认为是整体会一直为真
[[email protected] MyShell]$ echo $?
0
[[email protected] MyShell]$ [ a = b ] #字符串要写成"$a",和算术运算不一样
[[email protected] MyShell]$ echo $?
1
[[email protected] MyShell]$ [ $a = $b ] #这个虽然可以,以防万一要加上双引号,这种情况下面介绍
[[email protected] MyShell]$ echo $?
0

[ -n “$var” ] 这是正确写法,下面代码来说明一下

[[email protected] MyShell]$ echo "$ab" #ab为空
[[email protected] MyShell]$
[[email protected] MyShell]$ [ -n $ab ] && echo true #而ab为空显示true
true
[[email protected] MyShell]$ [ -n "$ab" ] && echo true #这个是正确结果
[[email protected] MyShell]$

[ 条件1 -a 条件2 ] 和 [[ 条件1 && 条件2 ]] 这里面的逻辑运算是一样的,里面没有逻辑短路问题,不过后面可以接与或逻辑短路。

数值比较用 -eq,-ne…
字符串比较用 ==,>,<…
字符串比较可以匹配正则表达式但是要用[[ “$var” =~ 正则表达式 ]],正则表达式不用加双引号。

变量

和其它语言一样Shell中也有变量, 而且更简单, 但有一些比较特殊的地方.

  1. Shell中的变量只有字符串这一种类型
  2. Shell中变量名与变量值没有长度限制
  3. Shell的变量也允许比较操作和整数操作, 只要变量中的字符串为数字

定义变量

需要注意: = 两边不能加空格, 当赋值语句包含空格时请加引号(单引号/双引号均可)比如: 1

variable_name="ghui‘s blog"

Shell中的变量可以分为两种类型:

  1. 局部变量 (定义变量时在前面加local修饰符)
  2. 全局变量 (定义变量时不加任何修饰符)

与其它语言一样局部变量的可见范围是代码块或函数内, 全局变量在全局范围内可见.看个简单的例子:


num=111
func1()
{
  local num=222
  echo $num
  }
echo "before---$num"
func1
echo "after---$num"

输出:

before---111
222
after---111

使用变量

使用一个定义过的变量, 只要在变量名前面加$即可, 如:

name=ghui
echo $name
echo ${name}

在使用变量时还有一个地方需要注意, 请看下面的例子:


str=‘abc‘
echo "1 print $str"
echo ‘2 print $str‘

输出:

 print abc
2 print $str

即: 被双引号括起来的变量会发生变量替换, 单引号不会

注释

Shell中注释使用#, 而且它不支持多行注释.

常用的字符串操作

字符串拼接

name="shell"
sayHi="hello, "$name" !"
sayHi2="hello, ${name} !"
echo $sayHi $sayHi2

注意: 上面说的单双引号引起的变量替换问题

获得字符串长度

string="abcd"
echo ${#string}

截取字符串

str="hello shell"
echo ${str:2}
echo ${string:1:3}

更多关于字符串的操作可以看这个

if/else流程控制

基本语法结构:

if condition
then
	 do something
	 elif condition
then
	do something
	elif condition
then
	do something
	else
	do something
	fi

其中, elif语句和else语句非必须的.看个例子:


a=1
if [ $1=$a ]
then
	echo "you input 1"
	elif [ $1=2 ]
then
	echo "you input 2"
	else
	echo " you input $1"
	fi

很简单, 不过这里有两个地方需要注意, 如果某个条件下的执行体为空, 则你就不能写这个条件 即下面这样会报错:

if condition
then
	#do nothing
	elif condition
then
	# do nothing
	#or
else
	#do nothing
	

另外, [ ] 两边一定要加空格, 下面这样都会报错:

if [$a=$b]
#or
if [ $a=$b]
#or
if [$a=$b ]

只有这样if [ $a=$b ]才是对的. 注意: 实际上这里的[]test命令的一种形式, [是系统的一个内置命令,存在路径是/bin/[,它是调用test命令的标识, 右中括号是关闭条件判断的标识, 因此下面的两个测试语句是等效的:

if test "2>3"
then
	...
	fi

if [ "2>3" ]
then
	...
	fi

[]之外, shell语言中还有几种其它括号, 比如: 单小括号/双小括号/双中括号/… , 不同的括号有不同的用法, 更多关于shell中, 括号的用法可以看看这个

switch流程控制

当条件较多时, 可以选择使用switch语句, shell中的switch语句的写法和其它语言还是有些不同的, 基本结构如下:

case expression in
	pattern1)
		do something... ;;
	pattern2)
		do something... ;;
	pattern2)
		do something... ;;
	...
	esac

看个例子:


input=$1
case $input in
        1 | 0)
        str="一or零";;
        2)
        str="二";;
        3)
        str="三";;
        *)
        str=$input;;
        esac
echo "---$str"

这个例子会根据你执行此脚本时传入的参数不同在屏幕上输出不同的值, 其中第一个case 1 | 0代表逻辑或. NOTE:

  1. ;;相当于其它语言中的break
  2. 每个pattern之后记得加)
  3. 最后记得加esac (即反的case)

for循环

基本结构:

for name [in list]
do
	...
	done

其中,[]括起来的 in list, 为可选部分, 如果省略in list则默认为in "[email protected]", 即你执行此命令时传入的参数列表. 看个例子:

for file in *.txt
do
	open $file
	done

遍历当前目录下的所有txt文件, 并依次打开.

while循环

基本结构:

while condition
do
	do something...
	done

看个例子:


i=0
while ((i
do
	((i++))
	echo "i=$i"
	done

输出:

NOTE: 你可能需要去了解一下(())的用法

until循环

基本结构

until condition
do
	do something...
	done

看个例子:


i=5
until ((i==0))
do
	((i--))
	echo "i=$i"
	done

输出:

跳出循环

shell中也支持break跳出循环, continue跳出本次循环.用法与C, Java中相同

函数

要定义一个函数, 可以使用下面两种形式:

function funcname()
{
	do something
	}

或者

funcname ()
{
	do something
	}

看个例子


add()
{
	let "sum=$1+$2"
	return $sum
	}
add $1 $2
echo "sum=$?"

输入

输出

其中, $?在shell中保存的是上一条命令的返回值

NOTE:

  1. 函数必须先定义后使用
  2. 如果在函数中使用exit会退出脚本, 如果想退回到原本函数调用的地方, 则可使用return

向脚本传递参数

先shell脚本传递参数, 非常简单, 只需要在你执行命令的后面跟上即可, 看个例子:


echo "$# parameters";
echo "[email protected]";
echo "$0"
echo "$1"

输入:

输出:

2 parameters
11 22
test.sh
11

解释: [email protected]代表所有参数的内容, $#代表所有参数的个数, $0代表脚本的名称, $1代表第一个参数的值.

=================================

---------------------
ref:https://blog.csdn.net/nange_nice/article/details/76531824

原文地址:https://www.cnblogs.com/emanlee/p/10332247.html

时间: 2024-11-11 15:20:29

Shell 基础知识和总结的相关文章

【Linux系列】【基础版】第三章 Shell基础知识

3. Shell基础知识     3.1 Shell的由来         3.1.1 Bourne Agin Shell         3.1.2 其他的shell, 有 zsh, ksh等     3.2 查看有没有shell         3.2.1 yum list | grep zsh         3.2.2 ls /root/.bash_history         3.2.3 echo $HISTSIZE -> vi /etc/profile 修改HISTSIZE的值 -

centos shell基础知识 2015-4-8 第十二节课

centos shell基础知识  2015-4-8 第十二节课 上半节课 下半节课 history:命令历史 ,默认保存1000条命令历史 !!:上一条命令 !$:上一条命令的最后一个参数 !n:执行命令历史里的第n条命令 !字符:最近那个字符的命令 Tab 键可以补全文件路径或者命令alias a=“b” unalias a通配符 *匹配零个或多个字符 ?匹配一个字符输入输出重定向 >, >>, <, 2>, 2>>管道符 |作业控制 ctrl+z, jobs

shell基础知识总结

1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对于kernel(内核)而言,指系统与外界(使用者)进行接触的部分,一个提供系统功能给用户使用的软件,它接受来自用户的指令,然后调用相应的应用程序. 为了满足不同的需求,shell提供了两种执行命令方式: a. 交互式:解释并执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令. b. 程序

shell基础知识---与监听服务器长连接端口状态

从未写过脚本我的最近接了俩脚本的需求,就在这分享一下我的我学到基础知识主要就四部分内容 一.变量 变量的定义 string='字符串' string="字符串" num=808string=str 字符串可以用单引号和双引号包裹,也可不包裹.数字话不用引号包裹的话就是一个数值. 变量也可以用来接受语句给变量赋值 file=`ls -l filepath/txt.txt` 上面的语句是接收filepath 下的txt.txt文档 数组的定义 程序中常用的还有数组在 Shell 中,用括号

shell基础知识讲解

第1章 shell基础 1.1 什么叫做shell编程 shell编程也叫做bash高级编程语法 1.2 常见的shell命令解释器 bash????????????redhat和centos使用 dsh????????????Ubuntu使用 csh和tcsh????unix使用 1.3 开发语言程序代码的分类说明 编译型????????????写完后需要编译才可以运行(C语言,java语言) 解释型????????????写完就可以直接运行(shell语言) 1.4 脚本规范 1.4.1 书

Shell基础知识

防伪码:长风破浪会有时,直挂云帆济沧海. 1.1 l Shell  简介 Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理, Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户. 下面是处理流程示意图: Shell 既然是工作在 Linux 内核之上,那我们也有必要知道下 Linux 相关知识. Linux 是一套免费试用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户.多

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(1)

在日常交际英语中,Shell可以翻译成壳,大多指能够对内部核心起到保护作用的一种装置或结构.在计算机科学中,shell其实是指:为操作者提供的.能够通过系统调用或库调用使用整个计算机资源的访问接口. 它既是一种命令解析器又是一种程序设计语言.作为命令解析器,它可以解释和执行用户输入的命令,也可以自动地解释和执行预先编写好并保存在某个文本文件中的一系列的命令:作为程序设计语言,shell特别定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和条件分支,让我们可以像使用高级语言

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(3)

五.注释 在非交互shell中或交互式shell中,内置命令shopt的选项interactive_comments被开启.以"#"开始的词使得这个词所在这一行上所有其他的剩余字符都被忽略(或称注释).交互式shell不用开启interactive_comments选项也不支持注释.interactive_comments选项在交互式shell中是默认启用的.注释是编写程序时,写程序的人给一个语句.程序段.函数等的解释或提示,能提高程序代码的可读性,以便于以后的参考.修改.后来,在应用

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(5)

十一.函数  shell函数就是按照上面SHELL GRAMMAR的描述定义的保存着一系列等待稍后执行的命令.当shell函数名被当做一个简单命令名使用时,被这个函数名关联的一系列命令都被执行.函数在当前shell的上下文环境中被执行:不会创建新的进程来解释它们(这与shell脚本的执行形成了对比).当执行函数时,函数的参数成为执行过程中的位置参数.特殊参数#被更新以反映这个变化.特殊参数0不会改变.函数执行时,FUNCNAME变量的第一个元素被设置为函数的名称.  shell执行环境的所有其他