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. 【Redis实现运行状态下切换RDB备份至AOF备份】

    redis持久化方式有哪些?又有何区别? rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能. aof:以追加的方式记录redis操作日志的文件,可最大程度的保证re ...

  2. 【Docker基本操作】

    关于镜像的操作 docker search centos 搜索所有centos的镜像 docker pull centos 获取centos镜像 docker images 或 docker imag ...

  3. php,javascript设置和读取cookie

    1.php设置cookie setcookie($name,$value,expire,path,domain,secrue); //$name:指的是cookie的名字:$value指的是cooki ...

  4. 【Henu ACM Round#17 C】Kitahara Haruki's Gift

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 判断sum/2这个价值能不能得到就可以了. 则就是一个01背包模型了. 判断某个价值能否得到. f[j]表示价值j能否得到. f[0 ...

  5. HDU 2846 Repository (字典树 后缀建树)

    Repository Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  6. 用Shell脚本过滤Hadoop中不能訪问的节点

    近期使用的一个集群hp1,由于维护集群的人不给力.节点总是过一段时间就掉一两个.今天发现重新启动hadoop时,HDFS已经进入保护模式了. 决定把slaves节点中的无法訪问的节点所有过滤掉.所以写 ...

  7. Codeforces 474D Flowers (线性dp 找规律)

    D. Flowers time limit per test:1.5 seconds memory limit per test:256 megabytes We saw the little gam ...

  8. 深入分析JavaWeb Item23 -- jsp自己定义标签开发入门

    一.自己定义标签的作用 自己定义标签主要用于移除Jsp页面中的java代码. 二.自己定义标签开发和使用 2.1.自己定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 要编写一 ...

  9. jquery--延迟对象

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  10. vim 基础学习之替换

    替换命令substitute可以用来查找跟替换操作. :[range]s[ubstitute]/{pattern}/{string}/[flags] [count] range-命令作用范围(缺省的情 ...