shell脚本语言之语法

一. shell变量

shell是弱类型语言,原则上,不是特别强调shell变量,或者shell变量可以放很多常见内容,这点和传统的C/C++有 很大不同。shell变量也不需要提前定义,或者不牵扯到定义一说,需要时直接使用即可。

1. 命名规则

(1)首个字符必须为字母(a-z,A-Z)。
(2)中间不能有空格,可以使用下划线(_)。
(3)不能使用标点符号。
(4)不能使用bash里的关键字(可用help命令查看保留关键字)。

2. 赋值规则

变量名和等号之间不能有空格! 否则会被Shell解释成命令和命令行参数。

3. 应用示例

#!/bin/bash 
myint=1000 
myfloat=3.14 
mystring="hello world" 
mychar=c

4. 使用变量

使用一个赋值过的变量,只要在变量名前面加美元符号即可:

echo $myint 
echo $myfloat 
echo $mystring 
echo $mychar 
echo "${mystring}hello bit"
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 
hello worldhello bit

注:在变量名外面加上${ },为了帮助解释器辨认清楚变量的边界。建议加上。

5. 只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

readonly mystring="hello world" 
echo $mystring 
mystring="hello bit" 
echo $mystring 
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 
hello world 
./test.sh: line 5: mystring: readonly variable hello world

5. 删除变量

使用 unset 命令可以删除变量。

#!/bin/bash

mystring="hello world" 
echo $mystring 
unset mystring 
echo $mystring 
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 
hello world

6. 变量类型

本地变量
即是局部变量,仅在shell实例中有效,其他shell上的程序不能访问。可以用set命令显示当前进程的所有变量。
环境变量
所有的程序都可以访问环境变量。shell脚本也可以定义环境变量。环境变量可以被子进程继承。
shell变量
指的是shell程序设置的特殊变量,包括环境变量和局部变量。
注:环境变量可以被子进程所继承并显示出来,但是本地变量只在本地shell有效。看下面示例:

#!/bin/bash echo $myval 
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 

[hb@MiWiFi-R1CL-srv test-shell]$ myval=100 
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 

[hb@MiWiFi-R1CL-srv test-shell]$ echo $myval 100

我们在父shell定义了一个变量myval,但是运行test.sh程序,没有得出myval的值,说明myval只在父shell有效。

[hb@MiWiFi-R1CL-srv test-shell]$ export myval 
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 
100

将myval设置成环境变量,子进程就可以访问了。

shell字符串

在shell中,将一切看作字符串,可以实现字符串的任意操作。并且不像C/C++,字符串必须括在双引号中,shell中的字符串即可以括在双引号中,也可以括在单引号中,也可以不括起来,直接使用。

1. 拼接字符串

shell的拼接字符串很简单,直接将信息写在一起就可以了。

#!/bin/bash

str1='hello ' 
str2=world 
echo $str1$str2' good' [hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 
hello world good

2. 获取字符串长度

用${# }可以获取字符串长度:

 #str=$str1$str2
 #echo ${#str}

3. 提取子字符串

 #str=$str1$str2
 echo ${str1:4}
 echo ${str1:1}
 echo ${str1:1,3}
 echo ${str1:1,3,4}

[jinyuyu@localhost progammer]$ vim test.sh
[jinyuyu@localhost progammer]$ ./test.sh
o
ello
lo
o

代换

1. 文件名代换(* ? [])

用于匹配的字符成为通配符。

通配符* :匹配0个或多个任意字符
?:匹配一个任意字符
[ ] : 匹配方括号中任意一个字符的一次出现。

示例:创建100个文件:

for i in {1..100}
do
touch file$i
rm file$i  #删除100个文件
done

2. 命令代换和算术代换

命令代换

(1)反引号` `括起来的一般为一条命令,将命令的输出结果代换到当前命令行中。

date=`date +%Y:%m:%d` 
echo $date 
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 
2018:5:20

(2)$( )也可以作为命令代换,()中的内容一般为命令。它也是将()中命令的执行结果替换到当前命令行中。

date=$(date +%Y:%m:%d) 
echo $date 
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 
2018:5:20

算术代换
算术代换用(()),在双括号中的执行规则一律按C处理。但是(()) 中只能用+ - * / () 运算符,并且只能做整数运算。

#!/bin/bash 
myint=100 
echo $myint 
(( myint++ )) 
echo $myint 

[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 
100 
101

作为右值使用:

res=$(( ++myint ))
echo $myint 
echo $res 

[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh 
100 
101  

4. 单引号和双引号

和C语言不一样,Shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。
单引号中的内容不做任何替换,全部按照纯文本处理。
双引号中的内容会对部分做替换,并不是全部按照纯文本处理。

$加变量名可以取变量的值;
反引号仍表示命令替换;

echo "hello bit $mystr\\ \" \\ \` `date +%y:%m:%d`"
echo 'hello bit $mystr\\ \" \\ \` `date +%y:%m:%d`'

[jinyuyu@localhost progammer]$ vim test.sh
[jinyuyu@localhost progammer]$ ./test.sh
hello bit good\ " \ ` 18:07:05
hello bit $mystr\\ \" \\ \` `date +%y:%m:%d`

你可能感兴趣的:(Linux,shell)