shell 初识

1.shell简介

1.1 shell

Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

1.2 shell脚本

Shell 脚本(shell script),是一种为shell编写的脚本程序。

1.3shell类型

bash
csh
dash
ksh
....

2.shell入门

2.1编写第一个shell脚本

test.sh:
#!/bin/bash
echo "Hello World !"

注:
    #!为一个约定的标记,指定shell的相应类型,用什么解释器执行

2.2执行脚本

1.
    #chmod +x test.sh
    #./test.sh
2.
    /bin/bash test.sh

3.shell 变量

3.1变量定义

var=val
var="val"
var=‘val‘
循环赋值:
for file in ‘ls /etc‘
规则:
1.变量定义时,不使用$符号;
2.变量名与等号之间不能有空格;
3.首个字符必须为字母(a-z,A-Z);
4.中间不能有空格,可以使用下划线(_);
5.不能使用标点符号;
6.不能使用bash里的关键字(可用help命令查看保留关键字)。

3.2使用变量

var=val
echo $var
echo $(var)

3.3只读变量

通过readonly关键字声明:
var=val
readonly var

3.4删除变量

通过unset关键字声明:
var=val
unset var

3.5变量类型

环境变量: 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

3.6shell字符串

1.字符串声明:
单引号:
    str=‘string‘
    单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号:
    str="string"
    双引号里可以有变量;
    双引号里可以出现转义字符
无引:
    str=string
2.拼接字符串:
    your_name="qinjx"
    greeting="hello, "$your_name" !"
    greeting_1="hello, ${your_name} !"
    echo $greeting $greeting_1
3.获取字符串长度:
    string="abcd"
    echo ${#string} #输出 4
4.提取子字符串:
    string="runoob is a great site"
    echo ${string:1:4} # 输出 unoo
5.查找子字符串:
    string="runoob is a great company"
    echo `expr index "$string" is`  # 输出 8
    注意: 以上脚本中 "`" 是反引号,而不是单引号 "‘"。

3.7shell数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
1.定义数组
    array=(val0 val1 val2 ...)

    array_name=(
    value0
    value1
    value2
    value3
    )

    array_name[0]=value0
    array_name[1]=value1
    array_name[n]=valuen
2.读取数组
    ${array[index]}
    通过"@"获得数组中的所有元素:
    echo ${array[@]}
3.获取数组长度
    获取数组元素个数:
    length=${#array[@]}
    length=${#array[*]}
    获得单个数组元素的长度:
    length=${#array[n]}

3.8shell注释

1.以"#"开头行表示shell注释行
2.shell无多行注释操作,只能每行行头添加"#"

4.Shell 传递参数

4.1传递参数使用

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
例:
test.sh:
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

效果:
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

4.2特殊参数

$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
    如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$    脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
[email protected] 与$*相同,但是使用时加引号,并在引号中返回每个参数。
    如"[email protected]"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

注:
$* 与 [email protected] 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
例:
test.sh:
#!/bin/bash

echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \[email protected] 演示 ---"
for i in "[email protected]"; do
    echo $i
done

效果:
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- [email protected] 演示 ---
1
2
3

5.shell基本运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
注意
1.使用的是反引号 ` 而不是单引号 ‘;
2.表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
例:
test.sh:
#!/bin/bash

val=`expr 2 + 2`
echo "两数之和为 : $val"

5.1 算数运算符

运算符 说明 举例
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 10。
* 乘法 `expr $a * $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

5.2 关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

运算符 说明 返回值
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。 [$a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

5.3 布尔运算符

运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

5.4 逻辑运算符

运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

5.5 字符串运算符

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

5.6 文件测试运算符

运算符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是具名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

6.shell echo命令

6.1 显示普通字符串

echo "It is a test"
echo It is a test

6.2 显示转义字符

echo "\"It is a test\""

6.3 显示变量

#!/bin/sh
read name
echo "$name It is a test"

6.4 显示换行

echo -e "OK! \n" # -e 开启转义
echo "It it a test"

6.5 显示不换行

#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"

6.6 显示结果定向至文件

echo "It is a test" > myfile

6.7 原样输出字符串,不进行转义或取变量(用单引号)

echo ‘$name\"‘

6.8 显示命令执行结果

echo `date`
注意是反引号,适用于执行相关命令。

7. shell printf命令

1.printf语法
    printf format-string [arguments ...]
例:
test.sh:
#!/bin/bash

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 

格式符使用同C语言的printf函数。

7. shell test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

7.1 数值测试

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

7.2 字符串测试

参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

7.3 文件测试

参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:
#!/bin/bash
cd /bin
if test -e ./notFile -o -e ./bash
then
    echo ‘有一个文件存在!‘
else
    echo ‘两个文件都不存在‘
fi

8.流程控制

8.1if else

1.
    if condition
    then
        command1
        command2
        ...
        commandN
    fi
2.
    if condition
    then
        command1
        command2
        ...
        commandN
    else
        command
    fi
3.
    if condition1
    then
        command1
    elif condition2
    then
        command2
    else
        commandN
    fi

8.2for

1.
    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done

无限循环:
    for (( ; ; ))
    do
        commands
    done

8.3while

1.
    while condition
    do
        command
    done
无限循环:
1.
    while :
    do
        command
    done
2.
    while true
    do
        command
    done

8.4case

1.
    case 值 in
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac

8.5until

1.
    until condition
    do
        command
    done

8.6 跳出循环

1.break:适用于所有循环,并且跳出所有循环
2.continue:适用于所有循环,跳出当前循环
3.esca:仅用于case循环中

9.shell函数

9.1 shell函数定义

[ function ] funname [()]

{

    action;

    [return int;]

}
说明:
    1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
    2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

9.2 shell 函数参数

1.
在shell函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
例:
test.sh:

#!/bin/bash
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

效果:
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

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

2.特殊参数
    同shell脚本传参相同,请回顾该小节。

10.Shell 输入/输出重定向

10.1重定向命令表

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

10.2 Here Document

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
它的基本的形式如下:
command << delimiter
    document
delimiter
注意:
    1.结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
    2.开始的delimiter前后的空格会被忽略掉。
例:
test.sh:
#!/bin/bash

cat << EOF
    welcome
    feison`s blog!
EOF

效果:
welcome
feison`s blog!

11.shell文件包含

1.Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
2.文件包含语法格式:
. filename   # 注意点号(.)和文件名中间有一空格
或
source filename

注意:
    被包含的文件 test1.sh 不需要可执行权限。

12.写在后面

本文是学习[菜鸟教程shell](http://www.runoob.com/linux/linux-shell.html)的笔记,记录的是本人在shell方面的薄弱点,主要是打基础,方便以后回顾,编写的不够深入和全面,大家如有不同看法可以留言评论,相互交流学习。
时间: 2024-11-09 05:02:29

shell 初识的相关文章

Shell初识

1.基本Shell语法:(hello,Shell) #!/bin/bash echo "hello,shell !" 运行的结果可想而知:控制台输出:hello,shell 2.Shell变量定义及引用: #!/bin/bash value="hello,shell" echo $value 运行结果:hello,shell 出现的问题:在变量定义时一定要注意‘=’两边不能有空格,习惯了编码规范的同学一般在定义变量的时候下意识的都会写成 value = "

linux学习第二天 (Linux就该这么学)

2018年11月10日,今天是学习的第二天 今天学习了安装vmware workstation12的安装及怎么安装 redhat7系统,在新建虚拟机时注意要选择"稍后安装操作系统"要vmwark workstation会以最精简安 装系统 后就没有相关命令 安装时选择内存推荐有两种方案1G和2G,并开启虚拟化功能,网络选择为 "仅主机模式"方便日后实验,安装系统时注意事项:SOFTWARE SELECTION 选项为"Server with GUI&quo

bash初识,shell的基础语法及基本特性

1.1 bash初识 1.1.1 什么是bash shell 是一个命令解释器,负责用户程序与内核进行交互操作的一种接口, 将用户输入的命令翻译给操作系统,并将处理后的结果输出至屏幕. 1.1.2 bash shell的作用 文件管理 用户管理 权限管理 磁盘管理 网络管理 软件管理 应用管理 ...管理 1.1.3 bash两种使用方式 1) 命令:效率低,适合少量工作 2) 脚本:效率高,适合大量工作 1.1.4 命令提示符 [root @ centos7 ~ ] # :超级管理员 [old

第一章 初识shell程序

1.执行shell脚本的三种方法: 1.1 使文件具有可执行权限,直接运行文件. 1.1.1 给文件加上x权限 1.1.2 ./test.sh 1.2 直接调用命令解释器执行程序 1.2.1 source test.sh  或者 . test.sh   点后边有空格 1.3 使用source执行文件 这种方式在执行脚本时,不会创建子进程,直接在父进程中执行.而上面两种都会创建子进程执行脚本. 在脚本执行过程中,并没有进程创建和消亡.当需要修改当前shell本身变量时,使用source命令. 2.

初识shell

shell为何物? 相信只要摸过计算机,对于操作系统 (不论是 Linux . Unix 或者是 Windows) 有点概念的朋友们大多听过这个名词,因为只要有操作系统,那么就离不开 Shell 这个东西.Linux 的管理常常需要透过远程联机,而联机时文字接口的传输速度一定比较快, 而且,较不容易出现断线或者是信息外流的问题.管理整个计算机硬件的其实是操作系统的核心 (kernel),这个核心是需要被保护的. 所以我们一般使用者就只能透过 shell 来跟核心沟通,以让核心达到我们所想要达到的

1.初识Shell脚本语言

PS:在做基于Linux系统的STM8固件升级项目中,需要让CPU通过I2C总线给STM8传输数据,刚开始一个一个的敲,很浪费时间,后来考虑到用shell脚本,虽然shell脚本用得非常简单,但是作用却不小,大大提高了数据传输效率. 1.vi编辑器的使用 vi编辑器有两种模式,命令模式和输入模式.输入命令:vim test.sh,回车,即可进入命令模式,此时不能进行编辑,需要输入i进入输入模式.输入完之后按wq保存退出,按q不保存退出.(vim是vi的增强版) 2.给文件权限 方法1:chmod

shell脚本初识

#!/bin/bash(linux脚本环境的声明即解释器,该解释器为bash,位于根目录下的bin目录下) 变量的定义与赋值: 格式:变量名=变量值(无需声明变量类型) 变量的引用: 格式:$变量名 或 ${变量名} 双引号内的内容允许变量引用和\转义 单引号内的内容不允许变量引用和\转义(对于变量引用和转义无作用) 反撇号(键盘数字1键左边的键)或者$():以命令输出进行替换 用来设置/记录系统运行的参数(环境变量): 系统赋值:USER.LOGNAME.HOME.SHELL...... 用户

Linux命令行–初识Linux shell

shell及脚本简介  GNU/Linux shell 是个交互工具,它为用户提供了启动程序.管理文件系统上的文件以及管理运行在Linux系统上的进程的途径 . shell的核心是命令行提示符 它是shell的交互部分 它允许你输入文本命令,之后将解释命令并将在内核中执行 shell包含一组内置命令,可以用来完成一些操作,如复制文件.移动文件.重命名文件以及显示和终止系统上正在运行的程序(PS:我一直在用ubuntu,前段时间刚更新到ubuntu16.04,通过看Linux命令行与shell脚本

SHELL环境变量初识(第六章)

1. 环境变量的概念 环境变量是用来存储shell会话和工作环境,方便shell轻松访问到设定值中的程序,环境变量分为全局变量和局部变量 2. 全局变量 全局变量在shell和它的子shell中都生效,可以通过env和printenv命令来查看当前环境变量 [[email protected] ~]# env HOSTNAME=localhost.localdomain SELINUX_ROLE_REQUESTED= TERM=linux SHELL=/bin/bash HISTSIZE=100