shell脚本如今已经成为了一种非常普遍的脚本语言,之所以如此广泛的被应用,毋庸置疑它是有它的独到之处的。shell脚本语言和其它的语言比方说c/c++有何不同呢?c/c++等语言属于编译型语言。也就是说程序每次运行前都要经过编译生成可运行的二进制文件方可;而shell属于解释型语言。它必须依赖解释器来逐行解释命令,如今我们所熟知并经常使用的解释器为bash解释器。所以以后学习使用一门解释型语言的时候。不可缺少的是首先得下载一个解释器。以下就来看一个简单的shell脚本:

#! /bin/bash
int_val=312
char_val='a'
float_val=3.12
string_val="aaaaaa"
echo $int_val
echo $char_val
echo $float_val
echo $string_val
echo $int_val'+'$char_val'+'$string_val'+'$float_val'
echo ${char_val}a$int_val

运行结果例如以下:


       由上图运行结果能够看出:我们所依赖的解释器就是bash,同一时候shell脚本中定义使用变量而且连接几个不同的变量远比我们使用c/c++实现方便多了!

 

        shell脚本中规定:变量使用前不须要定义类型,须要使用的变量由用户自己定义 。shell脚本下默认全部的变量均为字符串类型,所以我们就能够依据自己的需求进行字符串的连接,如上代码所看到的。连接过程中仅仅须要使用‘+’号或须要的字符就可以。

以下详细从shell的符号和shell的语法来学习记忆。

一.shell符号

1.当你写好一个shell标本后,如何无运行这个脚本的到自己所须要的结果呢?

答:有几种方法:(1)给脚本加上可运行的权限:chmod +x +文件名称 ,然后运行 ./+文件名称就可以

                                (2)/bin/bah +文件名称

                                (3)source ./+文件名称

                                 (4) . ./+文件名称

2.shell中有哪些变量呢?

答:按类型能够分为本地变量和环境变量,能够使用env查看当前系统中的全部环境变量。而本地变量仅仅存在于当前shell进程中,我们能够使用set命令来查看当前shell进程中全部的变量(包含本地变量和环境变量)。

这里与举一个样例:

(1)在当前shell中定义一个变量:value=100(注意这里等号两边都不能有空格。不然会被shell解释成命令和命令行參数)

(2)使用export能够导出这个变量到环境变量中

(3)使用env查看该命令就可以

例如以下图所看到的

(4)使用unset能够删除已定义的环境变量或者本地变量

3.shell怎引用变量?

答:如刚開始举得样例一般,定义变量不须要类型,取变量的值时仅仅需使用$+变量名就可以

4.我们怎么拿到本文件夹下全部符合条件的呢?

答:在这里。我们就提到了通配符,常见的通配符有:*、?

、[],分别解释例如以下:

(1)*:匹配0或者多个随意字符

(2)?:匹配一个随意字符

(3)[]:匹配方括号里随意一个字符的一次出现

样例例如以下:


5.如何使用命令代换?

答:命令代换就是shell先运行符号内的命令,然后将输出结果马上代换到当前命令行中。

例如以下样例:

#! /bin/bash
DATE=`date`
echo $DATE

#! /bin/bashDATE=$(date)echo $DATE

上面两段程序的运行结果例如以下:

6.转义字符在建立文件的时候怎么使用?

答:一般文件名称随用户定义。但当你想touch一个名为$ $的文件的时候,转移字符就派上用场了。

7.shell脚本中的单引號和双引號有共同点?

答:shell脚本中,单引號和双引號都仅仅是保持字符的字面意思,也就是说不正确字符的内容进行解释。

二.shell基本的语法

1.条件測试 

c语言中条件推断用的是if语句,而在shell脚本中,经常使用的两种条件測试命令时test和[.測试结果为真返回0。为假返回1(与语言的返回条件刚好相反)。以下是一些測试样例:

(1)

#! /bin/bash
read val
test $val -gt 10
echo $? [ $val -gt 10 ]
echo $?

运行结果例如以下:

当然除使用命令測试之外,命令也能够增加參数进行推断:

(2)

#! /bin/bash
read input
[ -d $input ]
echo $?
[ -f $input ]
echo $?
[ -z $input ]
echo $? [ -n $input ]
echo $?</span>

运行结果例如以下:

(3)字符串的推断

#! /bin/bah
str1="i am boy"
str2="t am gilr"
[ "X$str1" == "X$str2" ]
echo $?
一般字符串在做比較的时候。习惯在字符串中增加X防止空串出现

当然,測试命令之间还能够进行与或非逻辑运算。上面所比較的字符串的方法就是当中的一个样例

使用的语法为:[ 測试条件 -a 測试条件]

                          [!測试条件]

                          [ 測试条件  -o 測试条件]

#! /bin/bash
str1="i am a beautiful girl"
[ -f test.sh -a "X$str1" == "i am a beautiful girl" ]
echo $?

运行结果为1 。
2.if/then/elif/fi这个就相当于我们C语言中if语句,样例例如以下:

#! /bin/bash
read sex
if [ "Xsex" == "Xman" ];then
echo "you are a boy
elif [ "Xsex" == "Xwoman" ]
echo "you are a girl"
else
echo "say nothing"
fi

可是在这里,必须注意,if语句和fi之间不能有空语句,能够用:隔开,表示总是为真。样例例如以下:

#! /bin/bash
read input
if [ -d $input ];then
echo "$input is dir"
fi
if
: ;then
echo "/ is always true"
fi

除此之外,shell脚本还提供了&& 和||命令。它的作用相当于if...then  /if ...not then(样例例如以下)

#! /bin/bash
val=10
[ $val -eq 10 ] && {
echo "you are right"
exit 0
}
echo "not true" [ $val -eq 10 ] || {
echo "not true"
exit 1
}
echo "you are right“

3.case /esac它就相当于c语言中的switch语句。样例例如以下:

#! /bin/bash
read val
case $val in
a)
service iptables start
echo "start"
;;
b)
service iptables stop
echo "stop"
;;
c)
service iptables restart
echo "restart"
;;
esac

上述代码中的;;符号就类似于switch语句中的break。
4.循环语句,shell脚本下的循环语句与c语言的循环语句非常不同样,样例例如以下:

#! /bin/bash
for i in $@
do
echo "$i"
done
#! /bin/bash
for(( i=0; i<100; i++ ))
do
echo "$i"
done

当然另外一种方法就比較类似于c语言的写法啦!

5.while/ do/done,样例例如以下:

#! /bin/bash
echo "printf 1+1=? "
read val
while [ $val -eq 2 ]
do
echo "you are a smart man"
done

6.位置參数和特殊变量

(1)$0:表示命令行上可运行文件的文件名称

(2)$1、$2.....:表示命令行上的參数1,參数2 等等

(3)$@:表示參数列表

(4)$#:表示命令行參数的个数

(5)$?:表示当前进程的退出码

(6)$():表示命令替换

(7)$$:表示shell的进程号

7.函数:shell脚本中,函数一般先定义,定义的时候不写

參数和返回值,调用的时候仅仅需写出函数名就好。一般程序是从函数调用的地方运行的。

(样例例如以下

#! /bin/bash
function fool()
{
echo "smart"
}
fool

如上样例所看到的:shell脚本中是没有函数声明的,一般将函数定义能够写在脚本开头。

整个函数仅仅在以下条用的时候起作用。
8.数组:shell脚本如C语言一样也是支持顺序訪问下标元素的。一般在初始化数组元素的时候中间以空格隔开(样例例如以下)

#! /bin/bash
arr=("hello" 123 3.14)
i=0
for (( ; i<${#arr[@]}; ++i))
do
echo ${arr[$i]}
done


在上面这个样例中,表达式${#arr[@}是计算数组元素的个数的。模拟使用了C方式的书写格式,终于打印出来数组的元素。

shell基础之符号与语法的更多相关文章

  1. shell 基础语法

    shell 基础语法 =============================================== 推荐:http://c.biancheng.net/cpp/shell/ ==== ...

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

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

  3. Linux基础学习(10)--Shell基础

    第十章——Shell基础 一.Shell概述 1.Shell是什么: (1)Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来 ...

  4. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  5. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

  6. centos shell基础 alias 变量单引号 双引号 history 错误重定向 2>&1 jobs 环境变量 .bash_history source配置文件 nohup & 后台运行 cut,sort,wc ,uniq ,tee ,tr ,split, paste cat> 2.txt <<EOF 通配符 glob模式 发邮件命令mail 2015-4-8 第十二节课

    centos shell基础知识 alias  变量单引号 双引号   history 错误重定向 2>&1  jobs  环境变量 .bash_history  source配置文件 ...

  7. shell基础知识总结

    1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...

  8. linux shell 基础 使用日志与心得

    linux shell 基础 使用日志与心得 1.#!/bin/bash 第一行就出现#!/bin/bash是指此脚本使用/bin/bash来解释执行.其中,#!是一个特殊的表示符,其后,跟着解释此脚 ...

  9. [转帖]编写shell脚本所需的语法和示例

    编写shell脚本所需的语法和示例 https://blog.csdn.net/CSDN___LYY/article/details/100584638 在说什么是shell脚本之前,先说说什么是sh ...

随机推荐

  1. BZOJ2337: [HNOI2011]XOR和路径(高斯消元,期望)

    解题思路: Xor的期望???怕你不是在逗我. 按为期望,新技能get 剩下的就是游走了. 代码: #include<cmath> #include<cstdio> #incl ...

  2. NStimer 被堵塞

    我们在界面上滚动一个scrollview,那么我们会发如今停止滚动前,会发现NSTimer未被运行.就好像scrollView在滚动的时候将timer暂停了一样,在查看对应文档后发现,这事实上就是ru ...

  3. 【Cocos游戏实战】功夫小子第五课之帮助场景和选关功能的实现

    功夫小子之帮助场景和选关功能的实现 转载请注明出处:http://blog.csdn.net/suool/article/details/46661231 本节课的视频教程地址是: hmsr=teac ...

  4. 验证list的底层数据结构

    <STL源代码剖析>中,指出SGI STL的list底层数据结构式循环双向链表.而且在链表尾端留一个空白节点.让end指向它.因为是双向的,那么list的迭代器必须是Bidirection ...

  5. google dataflow model 论文

    http://www.chinacloud.cn/show.aspx?id=24446&cid=17

  6. LuoguP2754 [CTSC1999]家园(分层图,最大流)

    题目背景 none! 题目描述 由于人类对自然资源的消耗,人们意识到大约在 2300 年之后,地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,2177 年冬由于未知 ...

  7. 【Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) B】 Conan and Agasa play a Card Game

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 最大值出现次数是偶数. 那么就取次大值. 次大值也是偶数? =>再次 因为你绝对不能取偶数个的. 取了对方就总是能面对一个奇数 ...

  8. Irrlicht 3D Engine 笔记系列 之 教程5- User Interface

    作者:i_dovelemon 日期:2014 / 12 / 18 来源:CSDN 主题:GUI 引言 今天.博主学习了第五个教程. 这个教程解说了怎样使用Irrlicht内置的一个基础模块.GUI模块 ...

  9. 互联网+时代IT管理者的转型

    最近,大众创业万众创新的热潮真是一浪接着一浪,它实际上是一次政府和企事业的自我改革,利用互联网+的思维与技术对生产模式.流通模式与运营模式进行全新的变革,商业的本质是没有变的,仅仅是穿了个马甲来表演. ...

  10. Windows 98 二十岁了,这些功能都是从它开始的(虽然 Windows 98 不如 Windows 95 那样具有革命性,但完成度更高,更加成熟。到最后还是:相见不如怀念。)

    1998 年 6 月 25 日午夜,美国著名连锁零售店 CompUSA 门外挤满了狂热的消费者和媒体,他们在等待一款软件发售:Windows 98,即使明知它要到当天早上才正式上市. ▲ 在 Comp ...