菜鸟教程之学习Shell script笔记

以下内容是,学习菜鸟shell教程整理的笔记

菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.html

Shell简介

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

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

业界所说的shell通常是指shell脚本,但是shell和shell script是两个不同的概念。shell包括shell script和开发shell本身。一般实际生产操作过程中用的是shell编程,编写特定功能的shell script用来解决实际问题。

Shell环境

Bash:Bourne Again Shell (free and simple to use)

Bash是大多数Linux使用的system默认shell

一般情况下并不区分Bourne Shell 和 Bourne Again Shell,所以像#!/bin/sh 可以改为#!/bin/bash,#! 告诉系统其后路径指定的程序即是解释此脚本文件的shell程序。

Shell命令

  • $ echo "hello world" #输出命令
  • 运行shell脚本的两种方法:

    ./test.sh

    /bin/sh test.sh or /bin/php test.php #直接以解释器运行,就不需要在第一行指定解释器信息。

Shell变量

  • 和C语言的命名规则差不多,需要注意的是,不能使用标点符号,不能使用bash里的关键字(可用help命令查看保留的关键字)
  • 定义使用变量

    your_name="xxx"

    echo $your_name

    echo ${your_name} #变量名后面的花括号用来明确变量的边界
  • 只读变量

    使用readonly命令可以将变量变为只读变量

    readonly xxx
  • 删除变量

    unset xxx #unset 命令不能删除只读变量

Shell字符串

字符串可用用单引号,也可用双引号,亦可以不用引号

  • str='this is a string'

    your_name='runoob'

    双引号里面可以有变量,可以出现转义字符
  • 拼接字符串:
your_name="shell"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello,${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
  • 输出结果
hello, shell ! hello, shell !
hello, shell ! hello, ${your_name} !
  • 获取字符串长度
string="abcd"
echo ${#string} #在字符串前面加#就可以实现
  • 提取子字符串

    从第2个字符开始截取4个字符
 string="shell is great"
echo ${string:1:4} #输出 hell
  • 查找子字符串

    用 expr index 实现

    查找字符i或a的位置(哪个字母先出现就计算哪个)
string="shell is great"
echo `expr index "$string" io` # 输出 7 (空格也算字符)

Shell数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

  • 定义数组
数组名={value0 value1 valuue2....} or array_name=(
value0
value1
value2
value3
) #也可以单独定义:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
  • 读取数组
一般格式:${数组名[下标]}
vuluen=${array_name[n]}
使用@符号可以读取数组中所有的元素
echo ${array_name[@]}
  • 获取数组的长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
length=${#array_name[n]}
  • Shell注释

    用#号实现单行注释

    用:<<EOF .... EOF 实现多行注释,EOF 可以换成其它字母 如‘ or !

Shell传递参数

#!/bin/bash
echo "Shell 传递参数实例!"
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
eg:./test.sh 1 2 3

只会传递存在的参数个数,如果输入的是./test.sh 1 2 3 4 则4不会被输出

$# $* $@ 的作用及区别
#!/bin/bash
echo "Shell传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
echo "-- \$* 演示 --";
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 --";
for i in "$@"; do
echo $i
done 执行脚本,输出结果如下所示:
Shell 传递的参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
参数个数是:3
传递的参数作为一个字符串显示:1 2 3
--$* 演示 --
1 2 3
-- $@ 演示 --
1
2
3 $*与$@区别:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)
  • $$ :脚本运行的当前进程ID号
  • $- :显示Shell使用的当前选项,与set命令功能相同
  • $? :显示最后命令退出的状态 0表示没有错误 其他任何值表明有错误
  • Linux set命令用于设置shell set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。语法:set [+-abCdefhHklmnpPtuvx] -a  标示已修改的变量,以供输出至环境变量。

    -b  使被中止的后台程序立刻回报执行状态。

    -C  转向所产生的文件无法覆盖已存在的文件。

    -d  Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。

    -e  若指令传回值不等于0,则立即退出shell。

    -f   取消使用通配符。

    -h  自动记录函数的所在位置。

    -H Shell  可利用"!"加<指令编号>的方式来执行history中记录的指令。

    -k  指令所给的参数都会被视为此指令的环境变量。

    -l  记录for循环的变量名称。

    -m  使用监视模式。

    -n  只读取指令,而不实际执行。

    -p  启动优先顺序模式。

    -P  启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。

    -t  执行完随后的指令,即退出shell。

    -u  当执行时使用到未定义过的变量,则显示错误信息。

    -v  显示shell所读取的输入值。

    -x  执行指令后,会先显示该指令及所下的参数。

    +<参数>  取消某个set曾启动的参数。
  • 也可以在配置文件里修该Linux shell set

    全局配置文件(都在/etc/目录下,etc为environment config缩写):

    /etc/profile(不推荐修改)——每个用户在登录时都会调用

    /etc/bashrc(推荐在此处设置全局环境变量,只对bash有效)——每个用户在bash打开时都会调用

    /etc/paths(推荐在此处配置全局环境变量)——写法为一行一个路径,其他配置文件中可通过如下形式追加PATH:【export PATH=$PATH:[path1]:[path2]:[path3]……:[pathN] 】

用户配置文件:(都在~/家目录下)

~/.bash_profile(推荐在此处配置用户环境变量,只对bash有效)——当前用户登录时调用

~/.bashrc(推荐在此处配置用户环境变量,只对bash有效)——当前用户bash打开时调用

Shell数组

  • 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。

    与大部分编程语言类似,数组元素的下标由0开始。

    Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2)
  • 使用下标定义数组
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
  • 读取数组
${array_name[index]}
  • 使用@ or *可以获取数组中的所有元素
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的元素为:${my_array[*]}"
echo "数组的元素为:${my_array[@]}"
  • 获取数组的长度
用${#xxx[* or @]}获取数组的长度
eg:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组元素个数为:${#my_array[*]}"
echo "数组元素个数为:${#my_array[@]}" $ ./test.sh
数组元素个数为:4
数组元素个数为:4

菜鸟教程之学习Shell script笔记(上)的更多相关文章

  1. 菜鸟教程之学习Shell script笔记(下)

    菜鸟教程Shell script学习笔记(下) 以下内容是学习菜鸟教程之shell教程,所整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-sh ...

  2. 菜鸟教程之学习Shell script笔记(中)

    菜鸟教程Shell script学习笔记(中) 以下内容是学习菜鸟教程之shell教程,所整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-sh ...

  3. bash shell学习-shell script基础 (笔记)

    A chain no stronger than its weakest link. "一着不慎,满盘皆输" 参考资料:鸟哥的Linux私房菜 基础学习篇(第三版)  Linux ...

  4. 菜鸟的《Linux程序设计》学习—shell script

    1. 认识shell script shell script是利用shell的功能缩写的一个"程序",这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面, ...

  5. bash shell学习-shell基础 (笔记)

    When you hoist the sails to cross the sea, you willride the wind and cleave the waves. "长风破浪会有时 ...

  6. 第13章 学习shell script

    由于博客园中dollar符号有别的意义,所以文中的dollar符号使用¥表示 第一个script [root@localhost script]# cat -n sh01.sh #!/bin/bash ...

  7. 学习shell script

    摘要:概述.script的编写.test命令.[]判断符号.默认变量($1...).if...then条件判断式. 一.概述 [什么是shell script] 针对shell所写的脚本,将多个命令汇 ...

  8. 学习shell脚本笔记

    1.if 是单分支语句,使用格式如下: if condition ; then statement ….. fi 2.if … else 是双分支语句,使用格式如下: if condition ; t ...

  9. 鸟哥的Linux私房菜之学习shell script

    运行程序的时候一般都是创建一个子程序来执行,所以子程序中的变量什么的在当前的shell下没法使用,但是如果使用source来执行就可以在当前shell下执行程序 shift 1 去掉第一个参数,后面接 ...

随机推荐

  1. 随笔:关于Class.getSimpleName()

    最近学习过程中,遇到了Class.getSimpleName()这个方法,就搜索了一些资料: API定义: Class.getName():以String的形式,返回Class对象的"实体& ...

  2. 机器学习基础一(TP,TN,FP,FN等)

    TP:预测为正向(P),实际上预测正确(T),即判断为正向的正确率 TN:预测为负向(N),实际上预测正确(T),即判断为负向的正确率 FP:预测为正向(P),实际上预测错误(F),误报率,即把负向判 ...

  3. response响应

    郭晨 软件151 1531610114 response1.response常用APIsetStatus:设置响应行当中的状态码setHeader:设置响应头信息getOutputStream:获得字 ...

  4. 面向对象编程导论 An Introduction to Object-Oriented Programming (Timothy 著)

    第1章 面向对象思想 第2章 抽象 第3章 面向对象设计 第4章 类和方法 第5章 消息,实例和初始化 第6章 案例研究: 八皇后问题 第7章 研究研究: 台球游戏 第8章 继承与替换 第9章 案例研 ...

  5. java8_api_stream

    与集合联系紧密 Stream-1    stream概念    特点    使用示例

  6. Java BitSet解决海量数据去重

    先提一个问题,怎么在40亿个整数中找到那个唯一重复的数字? 第一想法就是Set的不可重复性,依次把每个数字放入HashSet中,当放不去进去的时候说明这就是重复的数字,输出这个数字. if(hs.co ...

  7. 注解@Resource和@Autowired区别对比

    @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Sprin ...

  8. cmake add_custom_command 使用

    cmake add_custom_command 使用 今天整理编译工程,想在编译工程前面用tolua生成c文件, 使用命令add_custom_command后,附加的命令并不执行,如下: add_ ...

  9. 1、IT人思维之投资开篇 - IT人思维之投资

    在IT圈中,很多人的认识就只在于工作中获取收益,这个观点是狭隘的,本身就不符合投资领域的内容.所以,在工作之余,笔者就对投资领域的内容进行的分析和收集整理相关的投资方面的内容,一方面对笔者自己的投资方 ...

  10. update_engine-FilesystemVerifierAction和PostinstallRunnerAction

    在介绍完了DownloadAction之后,还剩下FilesystemVerifierAction和PostinstallRunnerAction,下面开始对其进行分析. FilesystemVeri ...