shell基础之符号与语法

        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方式的书写格式,终于打印出来数组的元素。










posted @ 2018-01-20 21:50  llguanli  阅读(228)  评论(0编辑  收藏  举报