文档章节

linux学习-bash shell 编程

solate
 solate
发布于 2016/08/08 18:06
字数 1750
阅读 63
收藏 3
点赞 0
评论 0

shell 学习

hello world

编辑shell文件 vim hello.sh

#!/bin/bash
# This is a hello world
echo "hello world"

保存退出,加运行权限chmod u+x hello.sh(当前用户运行权限 ,a+x 所有人运行权限), 运行./hello.sh

例子说明:

  • #! 说明文件类型,类似windows文件后缀(.exe), linux 根据 #! 以及后面字符串信息确定文件类型(man magic 命令 以及 /usr/share/magic 了解更多)
  • /bin/bash 表明文件是一个bash程序,需要/bin下bash程序解释执行,使用locate bashfind / -name bash 2>/dev/nullwhereis bash 三个命令找出bash所在位置,如果没有需要自己安装bash安装包
  • bash中绝大多数语句没有分号

如何执行

  • bash hello.sh 或 sh hello.sh 显式执行
  • chmod u+x hello.sh,运行./hello.sh

bash被执行实际是linux另外开了一个进程来运行的。

变量

script 设置的变量名称: $0 /path/scriptname 命令名称,$1...$n 参数

  • $# :代表后接的参数『个数』,以上面为例这里显示为『 4 』;
  • $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
  • $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字符,默认为空格键.

Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则

  1. 首个字符必须为字母(a-z,A-Z) 或者_
  2. 中间不能有空格,可以使用下划线(_)
  3. 不能使用其他标点符号

需要给变量赋值时,写成变量名=值。 注意:不能在"="两边留空格

取用一个变量的值,只需在变量名前面加一个$

可以和其他文字混起来书写

num=2
echo "this is the ${num}nd"

shell的默认赋值是字符串赋值

var=1
var=$var+1
echo $var

# 打印出来的不是2而是1+1,要达到目的用下面的替换
let "var+=1"
var="$[$var+1]"
((var++))
var=$(($var+1))
var="$(expr "$var" + 1)" #不建议使用
var="`expr "$var" + 1`" #强烈不建议使用,注意加号两边的空格,否则还是按照字符串的方式赋值,`为Esc下方的`,而不是单引号'

let表示数学运算,expr用于整数值运算,每一项用空格隔开,$[]将中括号内的表达式作为数学运算先计算结果再输出。

使用date 进行文档建立(test.2016-12-13.dat)

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "I will use 'touch' command to create 3 files." # 纯粹显示信息
read -p "Please input your filename: " fileuser         # 提示使用者输入

# 2. 为了避免使用者随意按 Enter ,利用变量功能分析文件名是否有设定? 
filename=${fileuser:-"filename"}           # 开始判断有否配置文件名

# 3. 开始利用 date 指令来取得所需要的文件名了;
date1=$(date --date='2 days ago' +%Y%m%d)  # 前两天的日期
date2=$(date --date='1 days ago' +%Y%m%d)  # 前一天的日期
date3=$(date +%Y%m%d)                      # 今天的日期
file1=$filename${date1}                  # 底下三行在配置文件名
file2=$filename${date2}
file3=$filename${date3}

# 4. 将档名建立吧!
touch "$file1"                             # 底下三行在建立档案
touch "$file2"
touch "$file3"

关于filename=${fileuser:-"filename"}的用法,用来判断fileuser是否已经赋值。:-是一起的;fileuser 如果有值的话,就用所拥有的值赋予给filename变量;无值的话,就把filenname赋予给fileuser,再赋予给filename变量

shell 流控制

if 语句

if ....; then
  ....
elif ....; then
  ....
else
  ....
fi

通常用" [ ] "来表示条件测试,要确保方括号前后的空格,[$条件$]左右必须各敲一个括号($表示空格)

  • [ -f "somefile" ] :判断是否是一个文件
  • [-d “Directory”] : 判断目录是否存在
  • [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
  • [ -n "$var" ] :判断$var变量是否有值
  • [ "$a" = "$b" ] :判断$a和$b是否相等
#!/bin/bash

if [ ${SHELL} = "/bin/bash" ]; then
   echo "your login shell is the bash (bourne again shell)"
else
   echo "your login shell is not bash but ${SHELL}"
fi

&& 和 || 操作符

  1. command1 && command2: &&左边的命令返回真(即返回0,成功被执行)后,&&右边的命令才能够被执行

  2. command1 || command2 : ||则与&&相反。如果||左边的命令未执行成功,那么就执行||右边的命令;

case 语句

case ... in
   ...) do something here
   ;;
esac

 #!/bin/bash

 ftype="$(file "$1")"
 case "$ftype" in
 "$1: Zip archive"*)
    unzip "$1" ;;           #每个类别结尾使用两个连续的分号来处理
 "$1: gzip compressed"*)
    gunzip "$1" ;;
 "$1: bzip2 compressed"*)
    bunzip2 "$1" ;;
 *) echo "File $1 can not be uncompressed with smartzip";;  #最后一个变量内容都会用 * 来代表所有其他值
 esac                      #最终的 case 结尾


select 语句

select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择

select var in ... ; do
 break;
done
.... now $var can be used ....

#!/bin/bash

echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
  break;
done
echo "You have selected $var"

while/for 循环

只要测试表达式条件为真,则while循环将一直运行。关键字"break"用来跳出循环,而关键字”continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中。

while [ condition ]  <==中括号内的状态就是判断表达式
do            <==do 是循环的开始!
  程序段落
done          <==done 是循环的结束

for循环会查看一个字符串列表(字符串用空格分隔),并将其赋给一个变量

for var in ....; do
   ....
done

#!/bin/bash

for var in A B C ; do
   echo "var is $var"
done

for var in "$@"; do // $@ 包含有输入的所有命令行参数值 for var in "$*"; do // $* 意思是差不多的。但是只有一个字串。如果不加引号,带空格的参数会被截断

Shell里的一些特殊符号

1.* :通配符,可以使用双引号和单引号防止扩展.

单引号更严格一些,它可以防止任何变量扩展;而双引号可以防止通配符扩展但允许变量扩展:

#!/bin/bash

echo $SHELL
echo "$SHELL"
echo '$SHELL'

#结果
/bin/bash
/bin/bash
$SHELL

2.\ 转义字符

echo \*.jpg
echo \$SHELL

#结果
*.jpg
$SHELL

函数 function

function fname() {
  程序段
}

函数没有必要声明。必须在执行之前出现定义就行

function 也是拥有内建变量,内建变量与shell很类似,函数名称代表示 $0 ,而后续接变量也是以 $1, $2... 来取代的

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

function printit(){
  echo "Your choice is $1"   # 这个 $1 必须要参考底下指令的下达
}

echo "This program will print your selection !"
case $1 in
  "one")
  printit 1  # 请注意, printit 指令后面还有接参数!
  ;;
  "two")
  printit 2
  ;;
  "three")
  printit 3
  ;;
  *)
  echo "Usage $0 {one|two|three}"
  ;;
esac


#结果
输入  sh test.sh one
结果  Your choice is 1
因为打印方法传递的参数是1.

调试

sh [-nvx] scripts.sh

  • -n :不要执行 script,仅查询语法的问题;
  • -v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
  • -x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!

© 著作权归作者所有

共有 人打赏支持
solate
粉丝 7
博文 107
码字总数 80078
作品 0
成都
程序员
嵌入式Linux学习基础规划篇

嵌入式的学习是需要日积月累的,是通过一点一滴的积累才能成为大神。下面来介绍一下嵌入式linux学习基础规划,目标是达到适应嵌入式应用软件开发、嵌入式系统开发或嵌入式驱动开发的基本素质...

创客学院 ⋅ 04/10 ⋅ 0

《高级Bash脚本编程指南》十年来首次修订

  新年伊始,开源慕课的知识库上线了。初期提供了《Linux命令大全/Bash 参考》《高级Bash脚本编程指南》两个系列。其他资料正将陆续上线。   其中,《高级Bash脚本编程指南》对于Shell学...

dbtrain ⋅ 2016/01/28 ⋅ 0

Linux学习资料:教你在Win10运行Linux

Windows系统和Linux系统一直是水火不容,而在全新in10系统却完美兼容了Linux系统,这不得不说是开发者的仙音。当然这个Linux系统默认是不安装的,需要用户手动安装,下面×××老师就来介绍一...

长沙千锋 ⋅ 04/27 ⋅ 0

2013年5月编程语言排行榜:UNIX下的Bash

2013年5月9日,Tiobe公司发布新一期编程语言排行榜。新一期榜单前10位没有太多的变化,只是Objective-C与C++,Ruby与JavsScript在互相交换位置罢了。今天我们要关注的是排在TOP 20后半部的一...

oschina ⋅ 2013/05/09 ⋅ 58

关于ansible远程执行的环境变量问题(login shell & nonlogin shelll)

问题 ansible调用playbook远程mvn执行打包时发现执行出错,找不到。 我们的写在中,登录时可以正常执行打包并打印。 排查过程 在playbook中执行,为空 在playbook中添加,同时在远端服务器登...

银月光海 ⋅ 06/01 ⋅ 0

老鸟教你如何监控网站URL是否正常

监控网站URL是否正常最常见的方法莫过于wget和curl命令了,这两个命令都是非常强大的,强大到网友查看帮助都无从选择的地步了,今天呢,老男孩老师正好录制Shell编程实战课程,因此,顺便总结...

老男孩oldboy ⋅ 06/07 ⋅ 0

Linux命令与shell

资料来自:《http://blog.chinaunix.net/uid-14880649-id-2954340.html》 所谓shell就是命令解释程序。它提供了程序设计接口,可以使用程序来编程。学习shell对于Linux初学者理解Linux系统是...

hiqj ⋅ 2015/09/07 ⋅ 0

Spark2.1.0之运行环境准备

学习一个工具的最好途径,就是使用它。这就好比《极品飞车》玩得好的同学,未必真的会开车,要学习车的驾驶技能,就必须用手触摸方向盘、用脚感受刹车与油门的力道。在IT领域,在深入了解一个...

beliefer ⋅ 05/04 ⋅ 0

“笨办法”学Bash Shell(持续更新中)

  Shell是用户与Unix/Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用Shell脚本编程,完成更加复杂的操作。      在GUI日益完善的今天,在系统管理等领域,Shell编程仍然...

dbtrain ⋅ 2017/10/25 ⋅ 0

如何在 Linux 中不安装软件测试一个软件包

出于某种原因,你可能需要在将软件包安装到你的 Linux 系统之前对其进行测试。如果是这样,你很幸运!今天,我将向你展示如何在 Linux 中使用 Nix 包管理器来实现。Nix 包管理器的一个显著特...

10% ⋅ 06/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

容器之重命名镜像

使用docker tag命令来重命名镜像名称,先执行help,查看如何使用如下 mjduan@mjduandeMacBook-Pro:~/Docker % docker tag --helpUsage:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TA...

汉斯-冯-拉特 ⋅ 7分钟前 ⋅ 0

with 的高级用法

那么 上下文管理器 又是什么呢? 上下文管理器协议包含 __enter__ 和 __exit__ 两个方法。with 语句开始运行时,会在上下文管理器对象上调用 __enter__ 方法。with 语句运行结束后,会在上下...

阿豪boy ⋅ 26分钟前 ⋅ 0

使用 jsoup 模拟登录 urp 教务系统

需要的 jsoup 相关 jar包:https://www.lanzous.com/i1abckj 1、首先打开教务系统的登录页面,F12 开启浏览器调试,注意一下 Request Headers 一栏的 Cookie 选项,我们一会需要拿这个 Cook...

大灰狼时间 ⋅ 26分钟前 ⋅ 0

关于线程的创建

转自自己的笔记: http://note.youdao.com/noteshare?id=87584d4874acdeaf4aa027bdc9cb7324&sub=B49E8956E145476191C3FD1E4AB40DFA 1.创建线程的方法 Java使用Thread类代表线程,所有的线程对......

MarinJ_Shao ⋅ 38分钟前 ⋅ 0

工厂模式学习

1. 参考资料 工厂模式-伯乐在线 三种工厂-思否 深入理解工厂模式 2. 知识点理解 2.1 java三种工厂 简单工厂 工厂模式 抽象工厂 2.2 异同点 逐级复杂 简单工厂通过构造时传入的标识来生产产品...

liuyan_lc ⋅ 50分钟前 ⋅ 0

Java NIO

1.目录 Java IO的历史 Java NIO之Channel Java NIO之Buffer Java NIO之Selector Java NIO之文件处理 Java NIO之Charset Java 可扩展IO 2.简介 “IO的历史”讲述了Java IO API从开始到现在的发...

士别三日 ⋅ 54分钟前 ⋅ 0

[Err] ORA-24344: success with compilation error

从txt文本复制出创建function的脚本,直接执行,然后报错:[Err] ORA-24344: success with compilation error。 突然发现脚本的关键字,居然不是高亮显示。 然后我把脚本前面的空格去掉,执行...

wenzhizhon ⋅ 今天 ⋅ 0

Spring Security授权过程

前言 本文是接上一章Spring Security认证过程进一步分析Spring Security用户名密码登录授权是如何实现得; 类图 调试过程 使用debug方式启动https://github.com/longfeizheng/logback该项目,...

hutaishi ⋅ 今天 ⋅ 0

HAProxy基于KeepAlived实现Web高可用及动静分离

前言 软件负载均衡一般通过两种方式来实现: 基于操作系统的软负载实现 基于第三方应用的软负载实现 LVS是基于Linux操作系统实现的一种软负载,而HAProxy则是基于第三方应用实现的软负载。 ...

寰宇01 ⋅ 今天 ⋅ 0

微软自研处理器的小动作:已经开始移植其他平台的工具链

微软将 Windows 10 、Linux 以及工具链如 C/C++ 和 .NET Core 运行时库、Visual C++ 2017 命令行工具、RyuJIT 编辑器等移植到其自主研发的处理器架构 E2。微软还移植了广泛使用的 LLVM C/C++...

linux-tao ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部