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变量-数值运算运算符变量测试和内容替换