简单的说shell就是一个包括若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就能够使用单独的文件保存下来,以便日后使用。通常shell脚本以.sh为后缀。第一行一定要指明系统须要哪种shell解释用户的shell程序,如:#!/bin/bash 、#!/bin/sh等。

在这里我们使用#!/bin/bash。

通常shell由Linux命令(外部命令)、Shell(内部命令),控制语句和凝视语句等组成,类似与windows下的批处理文件(.bat)。还须要注意的是我们须要使用 chmod
 +x name.sh运行shell脚本。

(一)变量和数组

1. 用type推断是否是内部命令: type cmd

2. 变量赋空值的话,直接后面+回车,而且等号两边不可以有空格。

3. echo $a  输出a的值

4. export A,将A设成全局变量

显示变量的值:echo $A ,{}是用来防止混淆的。比如输出A的值后加上B字符:echo${A}B

5. 删除变量:unset A

6. 显示全部变量(包含本地):set ; set | grep A(显示A变量); env 显示全局变量(环境变量);初始化全局变量:export A=200。另外全局变量,依照惯例须要大写:export  LANG

注意:全局变量可被全部的shell环境下訪问。假设父Shell进程产生了子Shell进程。则环境变量可被“继承”并复制

7. 仅仅读变量,指不能被清除或又一次赋值的变量: readonly myvar

8. 位置參量(命令行參数):位置參量是一组特殊的内置变量,通常被shell脚本用来从命令行接受參数。或者被函数用来保存传递给他的參数。相当于C语言中的argv, 当中$1表示第一个參数。$2第二个....$9 以后要用花括号把数字括起来,${10};$0 代表当前脚本的文件名称。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

測试程序:

#!/bin/bash
#測试位置參数和其它特殊參数
#用法:/target.sh 參数1 參数2 IFS=#
echo shell script name is : $0
echo the count of parameters: $#
echo first param=$1
echo second param=$2
echo '$*='$* #显示全部的位置參数串
echo '"$*"="$*"'
echo '$@='$@
echo '"$@"='"$@"
echo '$$='$$ #显示当前进程号
echo $!

数组定义和初始化:arr=(math Chinese English)

数组引用:1. 引用变量:${arr[0]}  2.数组个数:${#arr[*]}  3.全部元素:${arr[*]}

数组赋值:arr[0]=chemial

须要注意的是shell的数组能够不连续的,这也是差别于其它语言的地方。比如:arr[0], arr[1],arr[2],arr[5]是同意的。他们的输出(假设之前赋值和下标同样的话),数组输出是0 1 2 5 。个数是4。

(二)输入和输出

-p 代表提示符; -t代表超时时间 。 echo $REPLY;echo -n 表示不会输出回车;-e “\t”代表转义选项

echo颜色输出和光标定位

\33表示转义開始,格式为 [数字m,从光标開始时改变颜色

\33[30m -- \33[37m 设置前景色
\33[40m -- \33[47m 设置背景色
\33[y;xH 设置光标位置 演示样例:
echo -e "\33[31mthis is a test"
echo -e "\33[10;5H\33[31;46mthis is a test"
echo -e "\33[0m"

(三)字符和測试语句

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

算术的扩展,注意:符号两端一定要留有空格。

表达式測试:

字符串測试:

检查空值

[ “$name” = “”]

[ ! “$name” ]

[ “X${name}” = “X” ]

注意:字符串測试的两边要有空格

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

也能够使用(( )),可是两者是不一样的,[]仅仅能和-eq之类的符号配对,而(())仅仅能和>,<=之类的符号配对。

另外[[ expr1 && expr2 ]]等也是能够的。(||)

測试的简单总结:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

(四)条件和循环语句

if语句:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

if [ $# -ne 1 ];then
echo Usage: $0 username
exit 1
fi
echo $1

注意:可运行语句块,假设为空,须要使用shell提供的空命令”:”,即冒号。

该命令不做不论什么事情,仅仅返回一个退出状态0。(shell下返回0为成功运行。返回1为失败)

case语句:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

#!/bin/bash

case $1 in
A)
echo this is A
;;
B|b)
echo this is B or b
;;
*)
echo others
;;
esac

for 语句:

循环的运行过程:运行第一轮循环时。将list中的第一个词赋给循环变量,并把该词从list中删除。然后进入循环体,运行do和done之间的命令。

下一次进入循环体时,则将第二个词赋给循环变量。并把该词从list中删除,依次列推。当list中的所有被移走后,循环就结束了。

位置參量使用 $*、“$*”、$@、"$@",能够省略in list ,此时使用"$@"

也能够使用例如以下形式:

for((exp1;exp2;exp3))
do
...
done

打印字符三角形:

#!/bin/bash

if [ $# -ne 1 ];then
echo 'usage:$0 <n> '
exit 1
fi if [ $1 -lt "5" -o $1 -gt "15" ];then
echo 'usage : $0 <n> '
echo ' where 5<=n<=15'
exit 1
fi for((i=0;i<$1;i++))
do
for((j=0;j<$[$1-$i-1];j++))
do
echo -n " "
done for((j=0;j<$[2*$i+1];j++))
do
echo -n "*"
done echo -ne '\n'
done

while语句:

until 语句:

select  列表:

select是个无限循环,因此要记住用break命令退出循环,或用exit命令终止脚本。也能够按ctrl+c退出循环。另外select常常和case联合使用。也能够省略in list。此时使用位置參量。

#!/bin/bash

PS3="favorite pet?

"
select var in Dogs Cats Birds
do
case $var in
Dogs)
echo Dogs are my favorite pet
break
;;
Cats)
echo Cats are my favorite pet
;;
Birds)
echo Birds are my favorite pet
;;
*)
echo none of my favorite pet
;;
esac
break
done

经常使用的字符串匹配:

shift命令

一般用于函数或者脚本程序參数的处理,特别是參数多于10以上的时候,将全部參数变量向下移动一个位置。$2变成$1,$3变成$2,依次递进,可是$0保持不变。

有趣的样例:

#!/bin/bash
while [ “$1” != “” ]
do
echo $*
shift
done

(五)捕获信号及其处理

锁屏程序:

#!/bin/bash

trap "nice_try" 2 3 15
TTY=`tty` nice_try()
{
echo -e "\nNice try,the terminal stays locked"
}
stty -echo
echo -n "Enter your pasword to lock $TTY:"
read PASSWORD
clear
echo -n "Enter your password to unlocked $TTY:"
while :
do
read RESPONSE
if [ "$RESPONSE" = "$PASSWORD" ];then
echo "unlocking ..."
break
fi
clear
echo "wrong password and terminal is locked ..."
echo -n "Enter your password to unlock $TTY:"
done
stty echo

stty -echo 是设置不回显的。

Shell 编程基础 --语法高速入门的更多相关文章

  1. shell编程基础语法

    创建文件:touch aaa.sh 把文件变成可执行的命令: chmod +x /Users/dream-mac/Desktop/aaa.sh (这里是文件路径,如果在当前路径下,只需要把文件名写到这 ...

  2. Objective-C基础语法高速入门

    Objective-C是Mac软件开发领域最基本的开发语言,假如我们对C语言已经非常熟悉或者具有面向对象语言的基础.对于我们学习Objective-C将会非常实用. 方法调用(Calling Meth ...

  3. Shell 编程基础语法

    # shell脚本 # 如何运行shell脚本 sh test.sh source test.sh ./test.sh # 需要有执行权限 # source和其他两种的区别是.source不会开新进程 ...

  4. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  5. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  6. shell编程基础(转载)

    Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...

  7. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  8. 6-2 shell编程基础

    shell编程基础 编程基础 Linus:Talk is cheap, show me the code 程序和编程风格 程序: 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结 ...

  9. Objective-C基础语法快速入门

    Objective-C基础语法快速入门 2010-11-04 16:32 折酷吧 zheku8 字号:T | T 假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C将会 ...

随机推荐

  1. sql 分组后按时间降序排列再取出每组的第一条记录

    原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记 ...

  2. leetcode题解:Search for a Range (已排序数组范围查找)

    题目: Given a sorted array of integers, find the starting and ending position of a given target value. ...

  3. 【Hadoop】三句话告诉你 mapreduce 中MAP进程的数量怎么控制?

    1.果断先上结论 1.如果想增加map个数,则设置mapred.map.tasks 为一个较大的值. 2.如果想减小map个数,则设置mapred.min.split.size 为一个较大的值. 3. ...

  4. Linux学习之一-从三个重要人物的故事和一张思维导图说起

    Linux是一套自由加开放源代码的类Unix操作系统,诞生于1991年10月5日(第一次正式向外公布),由芬兰学生Linus Torvalds和后来陆续加入的众多爱好者共同开发完成. Linux是一个 ...

  5. Python&lt;1&gt;List

    list里的元素以逗号隔开,以[]包围,当中元素的类型随意 官方一点的说:list列表是一个随意类型的对象的位置相关的有序集合. 它没有固定的大小(1).通过对偏移量 (2)进行赋值以及其它各种列表的 ...

  6. Windows无法删除文件 提示找不到该项目怎么办

    1 如图所示,我想要删除某个文件,提示如图所示,一般用360的强力删除也不管用.   2 在桌面新建一个文本文档,并输入以下内容.保存为bat格式(比如Delete.bat).然后把这个删不掉的文件拖 ...

  7. 解决ie7下overflow:hidden失效问题

    但父亲元素下面的子节点或者孙子节点有position:relative:或者absolute时,父亲即使设置了overflow:hidden:依然会溢出 解决方法可以: 在父亲元素上加上*positi ...

  8. react-native 创建 ios 项目

    创建React-Native项目 打开终端输入react-native init ProjectName,这里的ProjectName可以改成你想创建的项目名称.然后有两种方法启动项目 1.从终端开启 ...

  9. MySql 删除相同前缀的表名

    SELECT CONCAT('drop table ', table_name, ';') FROM information_schema.tables WHERE table_name LIKE ' ...

  10. JavaScript 判断浏览器及版本

    /* 智能机浏览器版本信息: alert("语言版本: "+browser.language); alert(" 是否为移动终端: "+browser.vers ...