什么是shell脚本

我自己对shell脚本的理解就是一系列的shell命令加入逻辑关系,实现类似“批处理”的功能。而不是简单的命令的堆砌,那样的shell脚本bug重重.

脚本开头需加#!/bin/bash (python 用#!/usr/bin/env python) 作为解释器,若不指定解释器,则需要对应的解释器来执行脚本

[root@server24 shell]# bash test.sh
[root@server24 shell]# python test.py

bash脚本的执行

当shell脚本以非交互的方式运行时,他先会查找环境变量ENV,该变量指定了一个环境文件(通常是 .bashrc),然后从该环境变量文件开始执行,当读了ENV文件后,SHELL开始执行shell脚本中的内容。

rename 更名

格式:rename old_name new_name file

[root@server24 shell]# ll
total 8
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_10.jpg
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_1.jpg
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_2.jpg
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_3.jpg
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_4.jpg
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_5.jpg
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_6.jpg
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_7.jpg
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_8.jpg
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_9.jpg
[root@server24 shell]# for i in `ls *.jpg`; do rename ".jpg" ".png" $i; done
[root@server24 shell]# ll
total 8
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_10.png
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_1.png
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_2.png
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_3.png
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_4.png
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_5.png
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_6.png
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_7.png
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_8.png
-rw-r--r-- 1 root root 0 Jun 6 13:20 echo_33804139_9.png

${}

${}虽然只有三个字符,但是功能特别强大。下面简单示例其功能

假设定义两个变量test,result

result=${test:-UNSET} 其表示的意思是:当test没有赋值时,将UNSET赋值给result,防止变量因为无定义,而导致最终结果无值。但并不给test赋值

[root@server24 shell]# result=${test:-'None'}
[root@server24 shell]# echo $result
None
[root@server24 shell]# echo $test [root@server24 shell]#

result=${test:=UNSET} 其表示的意思是: 当test没有赋值时,将UNSET赋值给test。防止变量无定义

[root@server24 shell]# result=${test:='None'}
[root@server24 shell]# echo $result
None
[root@server24 shell]# echo $test
None
[root@server24 shell]#

计算变量长度方法及性能比较

常见的计算变量长度的方法有

echo ${#test}
echo $test | wc -w
echo $(expr length “$test”)

对如上三种方法进行性能测试(将计算变量时间扩大10000倍)

time for i in `seq 10000`;do count=${#chars} ; done
real 0m1.049s
user 0m1.047s
sys 0m0.000s
time for i in `seq 10000`;do count=`echo "$chars" | wc -m` ; done
real 0m32.815s
user 0m6.768s
sys 0m23.580s
time for i in `seq 10000`;do count=`echo expr length "$chars"` ; done
real 0m12.342s
user 0m1.212s
sys 0m6.831s

从上面结果显示,虽然三种计算方法拥有同样的执行功能,但在性能(速度)上千差万别,所以一般在shell编程中劲量使用内置操作或函数完成,而不是使用外部调用命令。

变量的数值计算

(()) let expr bc $[]

(()) 一般置于$((….))语法中,如同引用双引号功能

let 效率无(())高

[root@server22 ~]# i=2
[root@server22 ~]# let i=i+3
[root@server22 ~]# echo $i
5

expr 将其后的串解释为表达式并计算其值,运算符前后必需有空格,特殊字符需要用转义字符

[root@server22 ~]# expr 2+2
2+2
[root@server22 ~]# expr 2 * 2
expr: syntax error
[root@server22 ~]# expr 2 \* 2
4
使用 expr $[$a*$b] 则不需要空格
[root@server22 ~]# expr $[2*3]
6

拓展:expr的其他用法

使用expr可判断其拓展名,若为真,返回非0: expr “$1” : “.*.pub”
[root@server22 ~]# expr "test.pub" : ".*.pub"
8
[root@server22 ~]# expr "test.txt" : ".*.pub"
0
使用expr也可判断是否为整型
[root@server22 ~]# expr g + 0
expr: non-numeric argument

bc 支持小数的运算

[root@server22 ~]# echo 5.43+4 |bc  #中间空格可有可无
9.43
[root@server22 ~]# echo `seq -s "+" 10`| bc
55 #1..10累加
[root@server22 ~]# echo "obase=2;256"| bc
100000000 ##进制转换
[root@server22 ~]# echo "scale=2; 5.23 / 3.4 " | bc
1.53 #保留两位小数

附加一个在练习脚本时遇到的一个小问题

简单数值计算

#!/bin/bash
function error() {
echo 'input error'
exit 1
} [ $# -eq 3 ] || error
expr $1 + 0 > /dev/null 2>&1
[ $? -ne 0 ] && error
#echo $2
[ "${2}" != '+' ] && [ $2 != '-' ] && [ "${2}" != '*' ] && [$2 != '/' ] && [ ${2} != '**' ] && [ "$2" != '%' ] && error
expr $3 + 0 > /dev/null 2>&1
[ $? -ne 0 ] && error echo $(($1 $2 $3))
[root@server24 shell]# ./guo_test_1.sh 5 \* 8
./guo_test_1.sh: line 11: [: too many arguments
40

在执行脚本时,运算符遇到*、**等特殊字符时就会报错,在传参时明明做了字符转义,字符串比较时又使用了其特殊用法,最后计算时又恢复了其字面意思。搞不懂了

====================修改于2016年7月24日=======================



将之前脚本重新执行了一下,观察得到:运算符在第一次的判断语句中是按照字面意思去执行,但是在第二次判断中,使用了其特殊用法,导致整个判断语句终止。在后面的执行过程中与判断无关,所以计算时还会按照我们设定的去运算。为什么第二次会变成那样呢?原来在脚本里面第一次判断时,我加了双引号表示传入的参数为一个字符串,而第二次没有加,所以将所有变量值打印出来,因此将脚本修改如下:

#!/bin/bash
function error() {
echo 'input error'
exit 1
} [ $# -eq 3 ] || error
expr $1 + 0 > /dev/null 2>&1
[ $? -ne 0 ] && error
[ "$2" != '+' ] &&
[ "$2" != '-' ] &&
[ "$2" != '*' ] &&
[ "$2" != '/' ] &&
[ "$2" != '**' ]
&& [ "$2" != '%' ] && error
expr $3 + 0 > /dev/null 2>&1
[ $? -ne 0 ] && error echo $(($1 $2 $3))

在尝试过程中曾用case语句去执行,但是这种方法有点繁琐。

#!/bin/bash
function error() {
echo "input error"
exit 1
}
[ $# -eq 3 ] || error
expr $1 + 0 > /dev/null 2>&1
[ $? -ne 0 ] && error
expr $3 + 0 > /dev/null 2>&1
[ $? -ne 0 ] && error
case $2 in
'*')
echo $(($1 $2 $3))
;;
'**')
echo $(($1 $2 $3))
;;
'+')
echo $(($1 $2 $3))
;;
'-')
echo $(($1 $2 $3))
;;
'/')
echo $(($1 $2 $3))
;;
'%')
echo $(($1 $2 $3))
;;
*)
error
;;
esac
[root@server22 shell]# ./compu_1.sh 3 \** 4
81
[root@server22 shell]# ./compu_1.sh 3 \* 4
12
[root@server22 shell]# ./compu_1.sh 3 / 4
0
[root@server22 shell]# ./compu_1.sh 3 % 4
3
[root@server22 shell]# ./compu_1.sh 3 + 4
7
[root@server22 shell]# ./compu_1.sh 3 - 4
-1

shell基础笔记的更多相关文章

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

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

  2. Shell 基础笔记

    1-22-shell脚本的基础 本节所讲内容:      shell 基本语法      变量 第1章 什么是SHELL?.. 2 1.1 shell编程.. 3 第2章 shell变量及运用.. ...

  3. shell基础笔记1

    ---恢复内容开始--- 1 test命令中不能使用浮点小数值,如:    A=1.444444:[    $A -gt 1  ] 2 test命令中的>或<必须转义,否则shell会把它 ...

  4. Shell基础笔记一

    由于工作需要,开始学习Shell编程,都是一些简单的基础知识,现整理收集分享出来,希望对大家有帮助 -------------------------------------------------- ...

  5. Linux实战教学笔记17:精简shell基础

    第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...

  6. 《UNIX-Shell编程24学时教程》读书笔记Chap1,2 Shell基础,脚本基础

    Chap1 Shell基础 知道该使用哪种命令是依赖于经验的.----惟手熟尔. 1.1 什么是命令 其实知道这些名词好像也没什么帮助,嘻嘻 1.2 什么是Shell 不同用户不同的提示符:不同的环境 ...

  7. shell基础二十篇 一些笔记

    shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...

  8. Linux笔记(shell基础,历史命令,命令补全/别名,通配符,输出重定向)

    一.shell 基础 shell是个命令解释器,提供用户和机器之间的交互 每个用户都可以拥有自己特定的shell centos7默认Shell为bash(Bourne Agin shell) 除了ba ...

  9. php代码审计基础笔记

    出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 --------------------------- ...

随机推荐

  1. 为什么S/4HANA的销售订单创建会触发生产订单的创建

    调用S/4HANA销售订单创建函数SD_SALES_DOCU_MAINTAIN创建一个销售订单时,会触发生产订单的创建. 销售订单的每个行项目对应一个独立的生产订单,SD_SALES_DOCU_MAI ...

  2. css3实现渐变

    chrome,苹果浏览器:—webkit- firebox浏览器:-moz- Opera浏览器:-o- 渐变分为:线性渐变(Linear Gradients)向下/向上/向左/向右/对角方向 径向渐变 ...

  3. Jenkins报错Caused: java.io.IOException: Cannot run program "sh" (in directory "D:\Jenkins\Jenkins_home\workspace\jmeter_test"): CreateProcess error=2, 系统找不到指定的文件。

    想在本地执行我的python文件,我本地搭建了一个Jenkins,使用了execute shell来运行我的脚本,发现报错 [jmeter_test] $ sh -xe D:\tomcat\apach ...

  4. BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也 ...

  5. vue中图片返回404时,显示默认的图片

    图片返回404时候的处理 <img :src="userMsg.portrait" ref="img" alt=""> _thi ...

  6. Semi-Supervised Dimensionality Reduction

    今天阅读了一篇关于半监督降维的论文,做个总结.这篇论文的全名叫<Semi-Supervised Dimensionality Reduction>(2006),是南大周志华老师的大作. 本 ...

  7. 如何安装zip格式的MySQL

    1.MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C: ...

  8. 【题解】洛谷P1283 平板涂色(搜索+暴力)

    思路 看到n<16 整个坐标<100 肯定想到暴力啊 蒟蒻来一发最简单易懂的题解(因为不会DP哈 首先我们用map数组来存坐标图 注意前面的坐标需要加1 因为输入的是坐标 而我们需要的是格 ...

  9. platform平台总线

    一.何为平台总线 (1)相对于usb.pci.i2c等物理总线来说,platform总线是虚拟的.抽象出来的.(2)CPU与外部通信的2种方式:地址总线式连接和专用协议类接口式连接.平台总线,是扩展到 ...

  10. 自己封装了的AlertController

    一直觉得使用系统这个东西写起来特别麻烦,每次都要写一大推东西,还是重复的,今天抽了点时间自己重新封装了一下,解决了自己的强迫症...,不多说,直接上代码了. 1.自己定义了一个名为XBZ的UIAler ...