shell入门笔记1:执行方式运行方式变量替换运算符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell入门笔记1:执行方式运行方式变量替换运算符相关的知识,希望对你有一定的参考价值。

说明:

本文是关于http://c.biancheng.net/cpp/shell/的相关笔记

 

shell的两种执行方式

交互式(interactive) 解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。

批处理 

(batch)

用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

 

运行shell脚本的两种方法

作为可执行程序 ./test.sh
作为解释器参数 /bin/bash test.sh

 

 

注意:

1.作为可执行程序运行时

一定要写成./test.sh,而不是test.sh。

直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh,

而当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,

要用./test.sh告诉系统说,就在当前目录找。

第一行需写上#!/bin/bash,

“#!”(读shebang) 是一个约定好的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。

通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。

2.作为解释器参数运行时

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

shell变量

定义变量 变量名=变量值 变量名和等号之间不能有空格
使用变量 ${变量名} 加花括号是为了帮助解释器识别变量的边界
只读变量 readonly 变量名 使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变
删除变量 unset 变量名 变量被删除后不能再次使用,unset命令不能删除只读变量

 

 

 

 

特殊变量

$n 传递给脚本或函数的参数 n是一个数字,表示第几个参数。例如,当前脚本的文件名是$0,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数  
$* 传递给脚本或函数的所有参数 被双引号(" ")包含时,将所有参数作为一个整体。
[email protected] 传递给脚本或函数的所有参数 被双引号(" ")包含时,将所有参数分开。
$? 上个命令的退出状态,或函数的返回值  
$$ 当前Shell进程ID  

 

技术分享
 1 #命令行参数:
 2 #运行脚本时传递给脚本的参数称为命令行参数。
 3 #命令行参数用$n表示,例如,$1表示第一个参数,$2表示第二个参数,依次类推。
 4 #$0表示当前脚本的文件名。
 5 
 6 #!/bin/bash
 7 
 8 echo "File Name: $0"
 9 echo "First Parameter: $1"
10 echo "Second Parameter: $2"
11 
12 echo "Total Number of Parameters: $#"
13 
14 #$*[email protected]的区别:都表示传递给函数或脚本的所有参数。
15 #不被双引号(" ")包含时,都以"$1""$2""$n"的形式输出所有参数。
16 #被双引号(" ")包含时,
17 #"$*"会将所有的参数作为一个整体,以"$1$2…$n"的形式输出所有参数;
18 #"[email protected]"会将各个参数分开,以"$1""$2""$n"的形式输出所有参数。
19 
20 echo "Quoted Values: "
21 echo "\\$*="$*
22 echo "\\[email protected]="[email protected]
23 echo "\\"\\$*\\"=""$*"
24 echo "\\"\\[email protected]\\"=""[email protected]"
25 echo "print each param from \\$*"
26 for var in $*
27 do 
28     echo "${var}"
29 done
30 echo "print each param from \\[email protected]"
31 for var in [email protected]
32 do 
33     echo "${var}"
34 done
35 echo "print each param from \\"\\$*\\""
36 for var in "$*"
37 do 
38     echo "${var}"
39 done
40 echo "print each param from \\"\\[email protected]\\""
41 for var in "[email protected]"
42 do 
43     echo "${var}"
44 done
45 echo "print each param from \\[email protected]"
46 for var in [email protected]
47 do 
48     echo "${var}"
49 done
50 echo "print each param from \\"\\$*\\""
51 for var in "$*"
52 do 
53     echo "${var}"
54 done
55 echo "print each param from \\"\\[email protected]\\""
56 for var in "[email protected]"
57 do 
58     echo "${var}"
59 done
60 
61 #$?可以获取上一个命令的退出状态。
62 #所谓退出状态,就是上一个命令执行后的返回结果。
63 #退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1。
64 #不过,也有一些命令返回其他值,表示不同类型的错误。
65 #$?也可以表示函数的返回值。
66 echo "Return Value of the Previous Command: $?"
67 
68 #$$表示当前Shell进程的ID,即pid。
69 echo "Current Shell Process ID: $$"
命令行参数

 技术分享

shell替换

如果表达式中包含特殊字符,Shell将会进行替换。

例如,在双引号中使用变量就是一种变量替换,转义字符也是一种替换,还有命令替换。

注:

echo默认不转义,也可以使用-E选项禁止转义,可以使用-e选项支持转义。

echo默认插入换行符,可以使用-n选项禁止插入换行符。

技术分享
 1 #命令替换:
 2 #shell可以先执行命令,将执行结果暂时保存,在适当的地方输出。
 3 #语法:
 4 #`command`
 5 
 6 #!/bin/bash
 7 
 8 #date显示当前时间
 9 DATE=`date`
10 echo "Date is ${DATE}"
11 
12 #who显示目前登入系统的用户信息
13 #|管道符号 ,上个命令的输出作为下个命令的输入
14 #wc -l显示行数
15 USERS=`who | wc -l`
16 echo "Number of the logged in users is ${USERS}"
17 
18 #uptime查看系统负载,信息显示依次为:现在时间、系统已经运行了多长时间、目前有多>少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载
19 #命令间用换行符或者;分隔
20 UP=`date;uptime`
21 echo "Uptime is ${UP}"
命令替换

 技术分享

变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。

可以使用的变量替换形式:

${var} 变量本来的值。
${var:-word} 如果变量var为空或已被删除(unset),那么返回word,但不改变var的值。
${var:=word} 如果变量var为空或已被删除(unset),那么返回word,并将var的值设置为 word。
${var:+word} 如果变量var被定义,那么返回word,但不改变var的值。
${var:?message} 如果变量var为空或已被删除(unset),那么将消息message送到标准错误输出,可以用来检测变量var是否可以被正常赋值。
若此替换出现在Shell脚本中,那么脚本将停止运行。

 

技术分享
 1 #!/bin/bash
 2 
 3 echo ${var:-"Variable is not set"}
 4 echo "1-Value of var is ${var}"
 5 
 6 echo ${var:="Variable is not set"}
 7 echo "2-Value of var is ${var}"
 8 
 9 unset var
10 echo ${var:+"This is a default value"}
11 echo "3-Value of var is ${var}"
12 
13 var="prefix"
14 echo ${var:+"This is a default value"}
15 echo "4-Value of var is ${var}"
16 
17 echo ${var:?"Print this message"}
18 echo "5-Value of var is ${var}"
19 
20 unset var
21 echo ${var:?"Print this message"}
22 echo "6-Value of var is ${var}"
变量替换

技术分享

 

shell运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。
expr是一款表达式计算工具,使用它能完成表达式的求值操作。

注意:
表达式和运算符之间要有空格,例如2+2是不对的,必须写成2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被` `包含,注意这个字符不是常用的单引号,在 Esc 键下边。

算术运算符

+ 加法 `expr $a + $b`
- 减法 `expr $a - $b`
* 乘法 `expr $a \\* $b`
/ 除法 `expr $b / $a`
% 取余 `expr $b % $a`
= 赋值 a=$b将把变量b的值赋给a
== 相等 用于比较两个数字,相同则返回true
!= 不相等 用于比较两个数字,不相同则返回true

 

 

 

 

 

 

 

 

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

-eq 检测两个数是否相等,相等返回true
-ne 检测两个数是否相等,不相等返回true
-gt 检测左边的数是否大于右边的,如果是,则返回true
-lt 检测左边的数是否小于右边的,如果是,则返回true
-ge 检测左边的数是否大于等于右边的,如果是,则返回true
-le 检测左边的数是否小于等于右边的,如果是,则返回true

 

 

 

 

 

 

布尔运算符

!
-o
-a

 

 

 

字符串运算符

= 检测两个字符串是否相等,相等返回true [ $a = $b ]
!= 检测两个字符串是否相等,不相等返回true [ $a != $b ]
-z 检测字符串长度是否为0,为0返回true [ -z $a ]
-n 检测字符串长度是否为0,不为0返回true [ -n $a ]
str 检测字符串是否为空,不为空返回true [ $a ]

 

 

 

 

 

文件测试运算符

文件测试运算符用于检测文件的各种属性。

-b file 检测文件是否是块设备文件,如果是,则返回 true
-c file 检测文件是否是字符设备文件,如果是,则返回 true
-d file 检测文件是否是目录,如果是,则返回 true
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true
-r file 检测文件是否可读,如果是,则返回 true
-w file 检测文件是否可写,如果是,则返回 true
-x file 检测文件是否可执行,如果是,则返回 true
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true
-e file

检测文件(包括目录)是否存在,如果是,则返回 true

 

 

 

 

 

 

 

 

 

 

 

 

技术分享
  1 #!/bin/bash
  2 
  3 a=10
  4 b=25
  5 
  6 ##算术运算符
  7 
  8 #加法
  9 val=`expr $a + $b`
 10 echo "a + b : $val"
 11 
 12 #减法
 13 val=`expr $a - $b`
 14 echo "a - b : $val"
 15 
 16 #乘法
 17 #乘号(*)前边必须加反斜杠(\\)才能实现乘法运算
 18 val=`expr $a \\* $b`
 19 echo "a * b : $val"
 20 
 21 #除法
 22 val=`expr $b / $a`
 23 echo "b / a : $val"
 24 
 25 #取余
 26 val=`expr $b % $a`
 27 echo "b % a : $val"
 28 
 29 #赋值,把变量b的值赋给a
 30 a=$b
 31 
 32 #条件表达式要放在方括号之间,并且要有空格
 33 #相等
 34 if [ $a == $b ]
 35 then
 36    echo "a is equal to b"
 37 fi
 38 
 39 #不相等
 40 if [ $a != $b ]
 41 then
 42    echo "a is not equal to b"
 43 fi
 44 
 45 
 46 a=10
 47 b=25
 48 
 49 ##关系运算符
 50 
 51 #是否等于
 52 if [ $a -eq $b ]
 53 then
 54    echo "$a -eq $b : a is equal to b"
 55 else
 56    echo "$a -eq $b: a is not equal to b"
 57 fi
 58 
 59 #是否不等于
 60 if [ $a -ne $b ]
 61 then
 62    echo "$a -ne $b: a is not equal to b"
 63 else
 64    echo "$a -ne $b : a is equal to b"
 65 fi
 66 
 67 #是否大于
 68 if [ $a -gt $b ]
 69 then
 70    echo "$a -gt $b: a is greater than b"
 71 else
 72    echo "$a -gt $b: a is not greater than b"
 73 fi
 74 
 75 #是否小于
 76 if [ $a -lt $b ]
 77 then
 78    echo "$a -lt $b: a is less than b"
 79 else
 80    echo "$a -lt $b: a is not less than b"
 81 fi
 82 
 83 #是否大于等于
 84 if [ $a -ge $b ]
 85 then
 86    echo "$a -ge $b: a is greater or equal to b"
 87 else
 88    echo "$a -ge $b: a is not greater or equal to b"
 89 fi
 90 
 91 #是否小于等于
 92 if [ $a -le $b ]
 93 then
 94    echo "$a -le $b: a is less or  equal to b"
 95 else
 96    echo "$a -le $b: a is not less or equal to b"
 97 fi
 98 
 99 
100 ##布尔运算符
101 
102 #非
103 if [ $a != $b ]
104 then
105    echo "$a != $b : a is not equal to b"
106 else
107    echo "$a != $b: a is equal to b"
108 fi
109 
110 #与
111 if [ $a -lt 100 -a $b -gt 15 ]
112 then
113    echo "$a -lt 100 -a $b -gt 15 : returns true"
114 else
115    echo "$a -lt 100 -a $b -gt 15 : returns false"
116 fi
117 
118 #或
119 if [ $a -lt 100 -o $b -gt 100 ]
120 then
121    echo "$a -lt 100 -o $b -gt 100 : returns true"
122 else
123    echo "$a -lt 100 -o $b -gt 100 : returns false"
124 fi
125 if [ $a -lt 5 -o $b -gt 100 ]
126 then
127    echo "$a -lt 100 -o $b -gt 100 : returns true"
128 else
129    echo "$a -lt 100 -o $b -gt 100 : returns false"
130 fi
131 
132 
133 ##字符串运算符
134 
135 a="abc"
136 b="efg"
137 
138 #是否相等
139 if [ $a = $b ]
140 then
141    echo "$a = $b : a is equal to b"
142 else
143    echo "$a = $b: a is not equal to b"
144 fi
145 
146 #是否不相等
147 if [ $a != $b ]
148 then
149    echo "$a != $b : a is not equal to b"
150 else
151    echo "$a != $b: a is equal to b"
152 fi
153 
154 #是否长度为0
155 if [ -z $a ]
156 then
157    echo "-z $a : string length is zero"
158 else
159    echo "-z $a : string length is not zero"
160 fi
161 
162 #是否长度不为0
163 if [ -n $a ]
164 then
165    echo "-n $a : string length is not zero"
166 else
167    echo "-n $a : string length is zero"
168 fi
169 
170 #是否为空
171 if [ $a ]
172 then
173    echo "$a : string is not empty"
174 else
175    echo "$a : string is empty"
176 fi
177 
178 
179 ##文件测试运算符
180 
181 file="$HOME/code/shell/operators.sh"
182 
183 #检测文件是否存在
184 if [ -e $file ]
185 then 
186    echo "File exists"
187 else
188    echo "File does not exist"
189 fi
190 
191 #检测文件是否是块设备文件或字符设备文件
192 if [ -b $file -o -c $file ]
193 then 
194    echo "File is a block or character device file"
195 else
196    echo "File is not a block or character device file"
197 fi
198 
199 #检测文件是否是目录
200 if [ -d $file ]
201 then 
202    echo "File is a directory"
203 else
204    echo "File is not a directory"
205 fi
206 
207 #检测文件是否为普通文件
208 if [ -c $file ]
209 then 
210    echo "File is an ordinary file"
211 else
212    echo "File is not an ordinary file"
213 fi
214 
215 #检测文件是否可读
216 if [ -r $file ]
217 then
218    echo "File has read access"
219 else
220    echo "File does not have read access"
221 fi
222 
223 #检测文件是否可写
224 if [ -w $file ]
225 then
226    echo "File has write permission"
227 else
228    echo "File does not have write permission"
229 fi
230 
231 #检测文件是否可执行
232 if [ -x $file ]
233 then
234    echo "File has execute permission"
235 else
236    echo "File does not have execute permission"
237 fi
238 
239 #检测文件是否为空
240 if [ -s $file ]
241 then
242    echo "File size is zero"
243 else
244    echo "File size is not zero"
245 fi
运算符

 

 技术分享











以上是关于shell入门笔记1:执行方式运行方式变量替换运算符的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程Shell中Bash变量-数值运算运算符变量测试和内容替换

Shell编程Shell中Bash变量-数值运算运算符变量测试和内容替换

shell 学习笔记

shell 学习笔记

shell 学习笔记

Shell编程入门