shell基础之符号与语法

Posted 梅诺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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_vala$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基础之符号与语法的主要内容,如果未能解决你的问题,请参考以下文章

Acwing Linux基础课笔记shell语法

Linux入门第五天——shell脚本入门(下)基础语法之循环与调试

shell编程2语法

shell基础学习系列二:变量

if 条件中的语法错误。不等号突出显示[重复]

01 shell编程之变量定义